[실전] Docker + Nginx + gunicorn + django

masterkorea01·2022년 2월 26일
1

docker

목록 보기
4/6

1. Dockerfile

FROM python:3.8

ENV PYTHONUNBUFFERED 1

RUN apt-get -y update && apt-get -y install vim && apt-get clean
RUN mkdir /project
ADD . /project

WORKDIR /project
RUN pip install --upgrade pip
RUN pip install -r requirements.txt

EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

1) FROM python:3.8

  • 파이썬 3.8 버전을 베이스 이미지로 사용

2) RUN mkdir /code

  • 컨테이너에 /code 디렉토리를 생성

3) WORKDIR /code

  • /code 디렉토리로 워킹 디렉토리를 변경

4) ADD ./backend/requirements.txt /code/

  • 로컬 위치의 requirements.txt 파일을 /code 디렉토리 하위로 복사

5) pip install

  • 프로젝트에 필요한 패키지 설치

6) ADD . /code/

  • 로컬 위치의 모든 파일 돌더를 /code 디렉토리 하위로 복사

2. docker-compose.yml

version: '3'
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: gunicorn backend.wsqi.application --bind 0.0.0.0:8000

    volumes:
      - .:/code
    ports:
      - "8000:8000"

1) version

  • docker compose 정의 파일의 버전

2) services

  • 서비스 정의

3) web

  • 서비스 명

4) build

  • 빌드 지정

5) context

  • Dockerfile이 있는 디렉토리 경로

6) dockerfile

  • 도커파일 명

7) command

  • 컨테이너 안에서 작동하는 명령 지정
  • 베이스 임지ㅣ에 지정되어 있을 경우 덮어쓴다.

8) volumes

  • 컨테이너에 볼륨을 마운트
  • 9) ports
  • 컨테이너가 공개하는 포트는 ports로 지정
  • <호스트 머신의 포트번호>:<컨테이너의 포트 번호>

3. docker-compose 명령어로 이미지 빌드하고 실행

$ docker-compose up --build

위 명령어로 실행한 뒤 웹 브라우저에서 Django 프로그램이 실행되는지 확인


4. nginx + gunicorn + django

위에서 작성한 docker-compose.yml 파일을 수정한다.

version: '3'
services:
  nginx:
    image:
      nginx:latest
    ports:
      - "80:80"
    volumes:
      - .:/code
      - ./nginx/nginx:/etc/nginx.conf.d
    depends_on:
      - web
  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: gunicorn backend.wsqi.application --bind 0.0.0.0:8000
    volumes:
      - .:/code
    expose:
      - "8000"

1) image

  • 도커 이미지

2) depends_on

  • 서비스의 의존 관계 정의
  • nginx 컨테이너를 시작하기 전에 web 컨테이너를 시작
  • depends_on은 컨테이너의 시작 순서만 제어
  • 컨테이너 상의 애플리케이션이 이용 가능해 질 때 까지 기다리고 제어하지 않는다.

5. nginx.conf 파일

worker_process auto;

events{
}

http{
    server{
        listen 80;

        include mime.types;

        location /static/ {
            alias /data/static
        }

        location /medai/{
            alias /data/media/
        }

        location / {
            proxy_pass http://django_container_gunicorn:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

6. gunicorn 설치

$ pip install gunicorn
$ pip freeze > requirements.txt

7. django settings.py

...
...
ALLOWED_HOSTS = ["web"]
...
..
.

8. docker-compose 명령어로 이미지를 빌드하여 실행

$ docker-compose up --build
profile
포폴 > https://gisanglee.github.io/

0개의 댓글