Docker

Docker gunicorn django 프로젝트 컨테이너 생성

끈끈 2023. 6. 1. 17:38

 

  • 기본적으로 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