- 기본적으로 runserver는 배포용이 아닌 개발용으로 사용되는 명령어
- django 프로젝트를 배포할 때 runserver가 아닌 gunicorn과 같은 서비스를 활용해 배포함
- runserver는 기본적으로 싱글 스레드에서 동작하지만, gunicorn은 멀티 스레드로 동작하도록 설정할 수 있기 때문에 많은 요청을 더 효율적으로 처리할 수 있음
- 이외에도 runserver에 비해 속도, 안정성 등 다양한 장점을 가지고 있기 때문에 배포 환경에서는 gunicorn을 사용하는 것을 권장함
gunicorn이란?
- 사용자의 요청을 받아 django에 작성한 코드를 실행시켜 주도록 하는 역할
- 배포용으로 사용되는 runserver
git clone으로 소스코드 다운받기
django 프로젝트 배포하기 전 설정
settings.py
ALLOWED_HOSTS = ['*']
STATIC_ROOT = BASE_DIR / "static"
timezone 설정
date : 날짜 및 시간 확인
sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
backend/Dockerfile
# python 3.10.8버전 이미지를 사용해 빌드
FROM python:3.10.8
# .pyc 파일을 생성하지 않도록 설정합니다.
ENV PYTHONDONTWRITEBYTECODE 1
# 파이썬 로그가 버퍼링 없이 즉각적으로 출력하도록 설정합니다.
ENV PYTHONUNBUFFERED 1
# /app/ 디렉토리를 생성합니다.
RUN mkdir /app/
# /app/ 경로를 작업 디렉토리로 설정합니다.
WORKDIR /app/
# requirments.txt를 작업 디렉토리(/app/) 경로로 복사합니다.
COPY ./django/requirements.txt .
# 프로젝트 실행에 필요한 패키지들을 설치합니다.
RUN pip install --no-cache-dir -r requirements.txt
# gunicorn을 사용하기 위한 패키지를 설치합니다.
RUN pip install gunicorn
docker-compose.yml
version: '3.8'
services:
backend:
container_name: backend
build: ./backend/
# drf_project.wsgi는 프로젝트 경로에 맞게 지정해야 합니다.
entrypoint: sh -c "python manage.py collectstatic --no-input && python manage.py migrate && gunicorn drf_project.wsgi --workers=5 -b 0.0.0.0:8000"
ports:
- 80:8000
volumes:
- ./backend/django/:/app/
- /etc/localtime:/etc/localtime:ro # host의 timezone 설정을 컨테이너에 적용합니다.
# ro 은 읽기 전용(read only) 속성으로 볼륨을 설정하는 것을 의미합니다.
restart: always
entrypoint 명령어
sh -c
>> 컨테이너에서 뒤에 작성한 명령어를 실행시킬 수 있도록 해줌
&&
>> 특정 명령어 실행 후 다음 명령어를 실행
python manage.py collectstatic --no-input
>> 배포를 위해 static 파일을 모아줌(settings.py에 STATIC_ROOT가 정의되어 있어야 함)
python manage.py migrate
>> django에 연결된 db migrate
gunicorn {project_name}.wsgi --workers=5 -b 0.0.0.0:8000
>> gunicorn을 사용해 django 프로젝트를 실행시킵니다.
>> {project_name} : django 프로젝트 이름
>> --workers=5 : django를 실행시킬 process 갯수(일반적으로 cpu 코어 갯수 * 2 + 1만큼 지정)
>> -b 0.0.0.0:8000 : 8000번 포트로 실행시킵니다.
컨테이너 동작 확인
sudo docker compose up --build -d
sudo docker compose logs
'Docker' 카테고리의 다른 글
Docker env 정보 관리 (1) | 2023.06.01 |
---|---|
Django nginx 웹서버 컨테이너 생성 (1) | 2023.06.01 |
Docker postgresql 컨테이너 생성 (1) | 2023.06.01 |
docker-compose.yml 두 개 이상의 컨테이너 생성하기 (1) | 2023.06.01 |
Docker entrypoint (1) | 2023.06.01 |