장고를 배포할때마다 WAS(Nginx, Gunicorn)을 세팅하기 너무 귀찮다.

그래서 Docker에 모든 세팅을 딱 만들어놓고 빌드만 하면 되는 세팅을 가지고 싶어서 이 글을 적는다.

참고로 python manage.py runserver 이걸로 배포라고 말하긴 좀 그렇다. 이건 오로지 개발용을 위한거다.

 

  ※ 서버 OS로 Ubuntu를 사용했습니다!

 

1. Django 프로젝트 docker-compose.yml

docker-compose를 활용해서 gunicorn, postgres DB, nginx를 한번에 설정할거다.

 

첫번째 web은 우리의 Django 프로젝트다 여기서 중요한점은 volumes이다 static_volume의 share를 통해서 nginx가 static파일을 처리하게 만들어줘야한다.

 

두번째 db는 말그대로 postgres DB다 별다른 설정이 없다

 

세번째 nginx는 웹서버다 이것도 별다른 설정은 없다.

version: '2.2'

services:
  web:
    build:
      context: ./
      dockerfile: Dockerfile
    command: gunicorn projectFile.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - static_volume:/code/staticfiles/
    expose:
      - 8000
    env_file:
      - ./.env.prod
    depends_on:
      - db
  db:
    image: postgres:12.0-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    env_file:
      - ./.env.prod.db
  nginx:
    build:
      context: ./nginx
      dockerfile: Dockerfile
    volumes:
      - static_volume:/code/staticfiles/
    ports:
      - 80:80
    depends_on:
      - web

volumes:
  postgres_data:
  static_volume:

 

 2. Django 프로젝트 Dockerfile

docker 컨테이너 안에서의 디렉토리는 code

static을 담당하는 디렉토리는 code/staticfiles

FROM python:3.7

# 환경 변수 설정
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# dependencies를 위한 apt-get update
RUN apt-get update && apt-get -y install \
    libpq-dev

RUN apt-get install -y netcat

# requirements.txt install
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/

# static file 
RUN python manage.py collectstatic

 

3. Django 프로젝트 setting을 위한 .env.prod 파일

DEBUG=0
SECRET_KEY=비밀
DJANGO_ALLOWED_HOSTS=11.11.11.11 localhost [::1]
SQL_ENGINE=django.db.backends.postgresql
SQL_DATABASE=HI
SQL_USER=HI
SQL_PASSWORD=HI
SQL_HOST=db
SQL_PORT=5432
DATABASE=postgres

 

 

4. Django 프로젝트 settings.py(.env를 사용)

 

    SECRET_KEY = os.environ.get("SECRET_KEY")
    ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS").split(" ")
    DATABASES = {
        "default": {
            "ENGINE": os.environ.get("SQL_ENGINE", "django.db.backends.sqlite3"),
            "NAME": os.environ.get("SQL_DATABASE", os.path.join(BASE_DIR, "db.sqlite3")),
            "USER": os.environ.get("SQL_USER", "user"),
            "PASSWORD": os.environ.get("SQL_PASSWORD", "password"),
            "HOST": os.environ.get("SQL_HOST", "localhost"),
            "PORT": os.environ.get("SQL_PORT", "5432"),
        }
    }

 

5. db를 위한 .env.prod.db 파일

POSTGRES_USER=HI
POSTGRES_PASSWORD=HI
POSTGRES_DB=HI

 

6. ngnix의 Dockerfile

docker-compose를 보면 알수있듯 nginx는 별도의 폴더를 만들어서 Dockerfile과 nginx.conf 파일을 관리한다.

ngnix폴더의 Dockerfile의 설정은 아래와 같다. 단순히 nginx의 이미지를 가져와서 nginx.conf 파일을 복붙!

FROM nginx:1.17.4-alpine

RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d

 

7. ngnix의 nginx.conf

여기서 중요한 점은 location /staticfiles/를 alias의 /code/staticfiles/로 처리해줘야한다 그래야 ngnix가 static파일들을 잘 처리할 수있다.

 

upstream HI {
    server web:8000;
}

server {

    listen 80;

    location / {
        proxy_pass http://HI;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

    location /staticfiles/ {
        alias /code/staticfiles/;
    }

    location /static/ {
        alias /code/staticfiles/;
    }
}

 

이렇게 하면 Django Docker production 세팅이 끝이다.

여기서는 DB도 만들었지만 실제로는 RDS와 같은 서비스 사용을 권장한다.

'django' 카테고리의 다른 글

Django workers process 메모리 공유  (0) 2021.02.19
Django queryset to json  (0) 2019.12.31
Django related_name(reverse 역참조 )  (0) 2019.11.13
헷가리는 Django Static 간략 정리  (0) 2019.10.18
DRF ForeignKey Update  (0) 2019.06.14

+ Recent posts