[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포트로 접속






LIST

Copyright © 2014 visionboy.me All Right Reserved.