Docker로 장고 + NGINX + PostgreSQL 개발 환경 구축

소개



개인용 PC에 언어 학습 환경을 준비하면 학습 환경이 불필요하게 된 후에 쓰레기 파일을 많이 할 수 있기 때문에 꽤 장애물이 높게 준비 할 수 없었습니다 만 WSL2 + Docker + VSCode 환경에서 손쉽게 개발 환경을 준비 할 수있는 것 을 알았으므로 서적 등을 참고로 Python 개발 환경 준비해 보았습니다.

실제로 Django 환경을 구축해 보았습니다만 NGINX와 UWSGI의 제휴가 꽤 능숙하지 않고 고생했기 때문에 비망록으로서 남기고 있습니다.

참고 사이트, 서적



장고
htps : // / cs. d 쟈고 p 로지 ct. 코 m/그럼/3.1/인 t로/인 s타르/

NGINX
htps : // / cs. Ngin x. 코 m / 응진 x / 아 d 민구이데 / ぇ b せ r ゔ ぇ r / 아 p가 와와 y

uWSGI 문서
htps : // 우ws 기도 cs. Red d. cs. 이오 / 엔 / 아 st / 쓰리 아 ls / D 쟈고 _ 앙 d _ 긴 긴 x. HTML
htps : // 기주 b. 코 m / ngin x / ngin x / b b / ms r / gon f / uwsgi_Para ms

참고서적

Docker Desktop for Windows / Mac에서 만드는 깨끗한 개발 환경 구축 입문 (Python 버전)

개발 환경 구축



다음의 폴더, 파일 구성으로 개발 환경을 구축해 갑니다.
Django_Dev
│
│  docker-compose.yml
│
├─db
│
├─django
│  │   Dockerfile
│  │   requirements.txt
│  │
│  └─uwsgi
│       uwsgi.ini
│
├─src
│  └─static
│
└─web
    │  uwsgi_params
    │
    └─conf
         nginx.conf

docker-compose.yml 파일 만들기



다음 내용으로 docker-compose.yml 파일을 만듭니다.

docker-compose.yml
version: '3.8'
services:

  db:
    image: postgres:13.1
    container_name: postgres
    volumes:
      - ./db/dbdata:/var/lib/postgresql/data
    expose:
      - '5432'
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=myappdb

  django:
    build: ./django
    image: django
    container_name: django
    expose:
      - '8080'
    volumes:
      - ./src:/code
      - ./django/uwsgi:/etc/uwsgi/
    depends_on:
      - db

  web:
    image: nginx:1.18.0
    container_name: nginx
    volumes:
      - ./web/conf:/etc/nginx/conf.d
      - ./web/uwsgi_params:/etc/nginx/uwsgi_params
      - ./src/static:/static
    ports:
      - '80:80'
    depends_on:
      - django


장고와 uWSGI 구축



파이썬 이미지를 기반으로 Dockerfile에서 장고와 uWSGI 환경을 구축합니다.

Dockerfile
FROM python:3.9.1-buster
RUN apt-get update && apt-get install -y tzdata && rm -rf /var/lib/apt/lists/*
RUN mkdir /etc/uwsgi
RUN mkdir /code
WORKDIR /code
COPY requirements.txt ${PWD}
RUN pip install -r requirements.txt
ENV PYTHONUNBUFFERED 1
ENV TZ=Asia/Tokyo
CMD ["uwsgi","--ini","/etc/uwsgi/uwsgi.ini"]


requirements.txt
Django==3.1.4
psycopg2==2.8.6
uwsgi==2.0.19.1


uwsgi.ini
[uwsgi]
module = myapp.wsgi
socket = :8080
uid = www-data
gid = www-data
chmod-socket = 755
vacuum = true

NGINX 개발 환경 구축



다음 내용으로 nginx.conf, uwsgi_params 파일을 만듭니다.

nginx.conf
upstream django {
    server django:8080;
}

server {
    listen      80;
    server_name dockerhost;
    charset     utf-8;

    location /static {
        alias /static;
    }

    location / {
        uwsgi_pass  django;
        include     /etc/nginx/uwsgi_params;
    }
}

uwsgi_params
uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;

uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;

uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

Docker 이미지 빌드



docker-compose.yml 파일이 있는 디렉토리에서 다음 명령을 실행하여 Django와 uWSGI가 설치된 Docker 이미지를 빌드합니다.
docker-compose build

실행 결과
db uses an image, skipping
web uses an image, skipping
Building django
Step 1/10 : FROM python:3.9.1-buster
3.9.1-buster: Pulling from library/python
(snip)
Successfully built a65b92412516
Successfully tagged django:latest

Docker 이미지 생성 확인



다음 명령을 실행하여 django 이미지가 생성되었는지 확인합니다.
docker images

실행 결과
REPOSITORY   TAG            IMAGE ID       CREATED         SIZE
django       latest         a65b92412516   6 minutes ago   936MB ★
python       3.9.1-buster   d1eef6fb8dbe   2 weeks ago     885MB

컨테이너 시작



다음 명령을 실행하여 컨테이너를 시작합니다.
docker-compose up -d

실행 결과
Creating network "django_dev_default" with the default driver
Pulling db (postgres:13.1)...
13.1: Pulling from library/postgres
(snip)
Status: Downloaded newer image for nginx:1.18.0
Creating postgres ... done
Creating django   ... done
Creating nginx    ... done

컨테이너 시작 확인



다음 명령을 실행하여 컨테이너가 시작되었는지 확인합니다.
docker ps -a

실행 결과
CONTAINER ID   IMAGE           COMMAND                  CREATED          STATUS          PORTS                NAMES
ff1bf925d1fe   nginx:1.18.0    "/docker-entrypoint.…"   19 seconds ago   Up 16 seconds   0.0.0.0:80->80/tcp   nginx
9a4e0631ed5d   django          "uwsgi --ini /etc/uw…"   20 seconds ago   Up 17 seconds   8080/tcp             django
b3e6d1bd4d77   postgres:13.1   "docker-entrypoint.s…"   20 seconds ago   Up 17 seconds   5432/tcp             postgres

이미지 파일 확인



docker-compose.yml에 지정된 이미지 파일이 다운로드되었는지 확인합니다.
docker images

실행 결과
REPOSITORY   TAG            IMAGE ID       CREATED          SIZE
django       latest         a65b92412516   10 minutes ago   936MB
postgres     13.1           1f1bd4302537   4 days ago       314MB
python       3.9.1-buster   d1eef6fb8dbe   2 weeks ago      885MB
nginx        1.18.0         05f64a802c26   3 weeks ago      133MB

장고 프로젝트 만들기



다음 명령을 실행하여 django 컨테이너에 연결 한 후 myapp 이름으로 프로젝트를 만듭니다.
docker-compose exec django /bin/bash
django-admin startproject myapp .

myapp 프로젝트 관련 파일 작성 확인



다음 명령을 실행하여 파일이 새로 작성되었는지 확인하십시오.
ls -lR
.:
total 4
-rwxr-xr-x 1 root root  661 Jan  4 11:41 manage.py
drwxr-xr-x 1 root root 4096 Jan  4 11:41 myapp
drwxrwxrwx 1 root root 4096 Jan  3 22:44 static

./myapp:
total 8
-rw-r--r-- 1 root root    0 Jan  4 11:41 __init__.py
-rw-r--r-- 1 root root  387 Jan  4 11:41 asgi.py
-rw-r--r-- 1 root root 3059 Jan  4 11:41 settings.py
-rw-r--r-- 1 root root  747 Jan  4 11:41 urls.py
-rw-r--r-- 1 root root  387 Jan  4 11:41 wsgi.py

./static:
total 0

장고 초기 설정



장고를 움직이기 위해 최소한의 초기 설정을합니다.

settings.py
import os

(snip)

ALLOWED_HOSTS = ["*"]

(snip)


DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'myappdb',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}

(snip)


LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

스틸 파일 집계



다음 명령을 실행하여 정지 파일을 정적 폴더에 집계합니다.
docker-compose exec django /bin/bash
./manage.py collectstatic

실행 결과
132 static files copied to '/code/static'.

서비스 재시작



설정을 반영하기 위해 다음 명령으로 서비스를 다시 시작합니다.
docker-compose restart
Restarting nginx    ... done
Restarting django   ... done
Restarting postgres ... done

서비스 시작 확인



다음 명령으로 서비스가 시작되었는지 확인합니다.
docker-compose ps -a
  Name                Command               State         Ports
----------------------------------------------------------------------
django     uwsgi --ini /etc/uwsgi/uws ...   Up      8080/tcp
nginx      /docker-entrypoint.sh ngin ...   Up      0.0.0.0:80->80/tcp
postgres   docker-entrypoint.sh postgres    Up      5432/tcp

동작 확인



브라우저에 로컬 루프백 주소를 입력하여 다음 화면이 표시되는지 확인합니다.



문제해결



문제가 해결되지 않으면 아래 명령을 사용하여 로그를 확인하면서 문제를 해결하십시오. 현재 설정은 로그를 Windows 측에 저장하는 설정이 아니므로 추가로 Windows 측에 저장하도록 해야 합니다.
docker-compose logs or docker-compose logs コンテナ名

요약



장고 환경을 준비했으므로 웹 응용 프로그램을 만들고 싶습니다.
완성되면 GitHUB에 업로드 예정입니다.

좋은 웹페이지 즐겨찾기