장고를 배포할때마다 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 |