[DOCKER] gunicorn 을 통한 django+nginx+postgres 연동
Posted by Albert 20Day 17Hour 47Min ago [2025-03-30]
폴더구조
├── django
│ ├── Dockerfile
│ ├── myapp
│ │ ├── db.sqlite3
│ │ ├── manage.py
│ │ └── myapp
│ │ ├── asgi.py
│ │ ├── __init__.py
│ │ ├── __pycache__
│ │ │ ├── __init__.cpython-311.pyc
│ │ │ ├── settings.cpython-311.pyc
│ │ │ ├── urls.cpython-311.pyc
│ │ │ └── wsgi.cpython-311.pyc
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
│ └── requirements.txt
├── nginx
│ ├── default.conf
│ └── Dockerfile
└── postgres
└── Dockerfile
컨테이너 실행 네트워크 생성
root@albert:/work/study/gunicorn/nginx' docker network create mynetwork02
a407dc9255d1f4ea3cbd67c6c1f1f982e2e3a2c2e3b3c17411c3337a19a08c3e
root@albert:/work/study/gunicorn/nginx' docker network ls
NETWORK ID NAME DRIVER SCOPE
cf4ce18fe96c bridge bridge local
d90f3cf301b9 host host local
a407dc9255d1 mynetwork02 bridge local
e13595119367 none null local
postgresql 설정
Dockerfile
FROM postgres:15.4
volume, 및 컨테이너 생성
root@albert:/work/study/gunicorn/postgres' docker volume create myvolume
root@albert:/work/study/gunicorn/django' docker container run --name postgrestest --network mynetwork02 -e POSTGRES_PASSWORD=mysecretpassword --mount type=volume,source=myvolume,target=/var/lib/postgresql/data -d npostgres
requirements.txt (django, gunicorn 버전추가)
django==4.2.7
gunicorn==20.1.0
psycopg2==2.9.9
Dockerfile(requirements.txt 기준으로 설치 및 8000포트로 접속가능하도록 gunicorn세팅)
FROM python:3.11.6
WORKDIR /usr/src/app
COPY . .
RUN python -m pip install --upgrade pip
RUN pip install -r requirements.txt
WORKDIR ./myapp
CMD gunicorn --bind 0.0.0.0:8000 myapp.wsgi:application
EXPOSE 8000
postgres 연결 myapp/myapp/setting.py db연결정보 추가(HOST는 postgres컨테이너 아이디)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'mysecretpassword',
'HOST': 'd084bca41460',
'PORT': '5432',
}
}
nginx default.config (nginx 80 포트로 받는 요청을 django container name이 djangotest 인 컨테이너 8000포트로 전송하도록 세팅)
upstream myweb{
server djangotest:8000;
}
server{
listen 80;
server_name localhost;
location /{
proxy_pass http://myweb;
}
}
Dockerfile (nginx 설정을 default.conf로 설정)
FROM nginx:1.25.3
RUN rm /etc/nginx/conf.d/default.conf
COPY default.conf /etc/nginx/conf.d/
CMD ["nginx", "-g", "daemon off;"]
django,nginx 이미지 빌드
root@albert:/work/study/gunicorn/django' docker image build . -t myweb02
[+] Building 5.5s (11/11) FINISHED docker:default
root@albert:/work/study/gunicorn/nginx' docker build . -t mynginx02
[+] Building 1.7s (8/8) FINISHED docker:default
docker image 조회
root@albert:/work/study/gunicorn/nginx' docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
mynginx02 latest db2def3ce91f 11 seconds ago 192MB
myweb02 latest ba25c34a6ae7 3 minutes ago 1.07GB
생성한 mynetwork02 기반으로 django(djangotest) , nginx(nginxtest) 실행
root@albert:/work/study/gunicorn/nginx' docker container run -d --name djangotest --network mynetwork02 myweb02
751b45258a2617df9b83ed718014e9ac73e77223ddff0766dff8667a4bea6d09
root@albert:/work/study/gunicorn/nginx' docker container run -d --name nginxtest --network mynetwork02 -p 80:80 mynginx02
4f9511f920b3e75d3f1b8fdc772ab0e29a8827431e7f46578c2cc0fa2b17bd52
등록된 container 확인
root@albert:/work/study/gunicorn/django' docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
609471738f6c mynginx02 "/docker-entrypoint.…" 11 minutes ago Up 11 minutes 0.0.0.0:80->80/tcp, [::]:80->80/tcp nginxtest
5800fdc78035 myweb02 "/bin/sh -c 'gunicor…" 12 minutes ago Up 12 minutes 8000/tcp djangotest
d084bca41460 mypostgres02 "docker-entrypoint.s…" 52 minutes ago Up 52 minutes 5432/tcp postgrestest
웹상 80포트로 접속

끝