Django & Nginx를 도커(Docker)로 실행하기 (with. docker-compose)

2021. 8. 12. 19:19프로그래밍 개발(Development)/Docker

반응형

Django와 Nginx 도커 이미지(Image)를 생성하고, Docker-Compose를 이용하여 실행하고 관리하는 방법을 알아보자.

 

Django의 Docker 이미지(Image)를 생성 해보자.

 

먼저 Docker의 폴더 구조를 먼저 확인해보자.

docker_web
  ├─docker-compose.yml
  │
  ├─django
  │  │  db.sqlite3
  │  │  Dockerfile
  │  │  uwsgi.ini
  │  │  manage.py
  │  │  server.py
  │  │  requirements.txt
  │  │
  │  ├─django
  │  │  │  settings.py
  │  │  │  urls.py
  │  │  │  wsgi.py
  │  │  │  __init__.py
  │  │  │  templates
  │  │  └──static
  │  │
  │  └─application
  │
  └─nginx
      │  Dockerfile
      │  nginx.conf
      └──html
      	   │  index.html
           └──50x.html

1. Create Django Docker Image

django(프로젝트폴더)에 Dockerfile을 하나 생성을 하고 아래와 같이 내용을 작성해준다.

 

Dockerfile

# python 버전 or latest 입력
FROM python:2.7.15			# 도커에 설치될 python 버전

ENV PYTHONUNBUFFERED 1

RUN apt-get -y update
RUN apt-get -y install vim

RUN useradd -r nginx
RUN usermod -a -G root nginx

RUN mkdir /srv/django			# docker안에 srv/django 폴더 생성
ADD . /srv/django			# 현재 디렉토리를 srv/django 폴더에 복사

WORKDIR /srv/django			# 작업 폴더 설정

RUN pip install --upgrade pip
RUN pip install -r requirements.txt	#  python 패키지 설치

EXPOSE 8000
# django를 단독으로 실행할때 사용 명령어
# 단, nginx를 이용해서 django를 실행할때는 주석처리!!
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

# uwsgi를 이용해서 django를 실행할때 사용(테스트용)
#CMD ["uwsgi", "-i", "/srv/sdn/uwsgi.ini"]

Docker 파일이 생성이 되면 build를 해서 image 파일을 만들어 준다.

# -t 옵션은 image에 이름을 넣기 위한 옵션이다.
#  . 은 경로를 의미한다.
# 현재 Dockerfile이 있는 경로에 있기 때문에 . 사용

$ docker build -t docker/django .

build 명령어로 image 파일을 만들게 되면, image list 명령어로 리스트 확인이 가능하다.

# docker image list or docker image ls 명령어 사용
$ docker image list

REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
docker/django        latest              47b633019e47        3 weeks ago         1.56 GB
docker.io/python     2.7.15              afc94ac1e19b        2 years ago         925 MB

Docker image가 생성이 되었기 때문에 이제 컨테이너를 실행해 보자

# -p 옵션은 포트 옵션으로 [서버포트:도커포트]를 의미한다.
$ docker run -p 8000:8000 docker/django

Dockerfile에 runserver 실행 명령어(CMD)를 작성해놨기 때문에 컨테이너가 실행이 되면 runserver가 실행이 된다.

url을 접속하여 django 페이지를 확인해보면 된다.


2. Create Nginx Docker Image

nginx의 경우는 conf 파일과 Dockerfile만 있으면 만들 수 있다.

 

nginx.conf

user  nginx;
worker_processes  10;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;
        #root /srv/sdn

        location = favicon.ico { access_log off; log_not_found off; }

        location /static/ {
            root /srv/django/django;
        }

        location / {
            uwsgi_pass unix://srv/django/django.sock;
            uwsgi_read_timeout 999999;
            include uwsgi_params;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

nginx.conf 파일은 상황에 따라 내용이 달라질 수 있으며, 사용 방법에 따라 파일을 나누어 생성 할 수도 있다.

 

Dockerfile

FROM nginx:latest

RUN apt-get -y update
RUN apt-get -y install vim

RUN mkdir /etc/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
COPY html/ /etc/nginx/html

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

django와 동일하게 build를 한다.

$ docker build -t docker/nginx .

build가 완료 되면 image가 생성이 되었는지 확인한다.

$ docker image list

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker/nginx         latest              f9de46de73af        3 weeks ago         184 MB
docker/django        latest              47b633019e47        3 weeks ago         1.56 GB
docker.io/nginx     latest              4cdc5dd7eaad        5 weeks ago         133 MB
docker.io/python    2.7.15              afc94ac1e19b        2 years ago         925 MB

nginx가 잘 실행이 되는지 컨테이너를 실행해본다.

$ docker run -p 80:80 docker/nginx

url을 치고 접속하게 되면 nginx가 실행이 되는걸 확인 할 수 있다.

다만, django.sock과 연결이 되지 않아 django와는 연결이 되어 있지 않다.

 

이제 Nginx와 django를 연결하기 위해 docker-compose를 사용할 것이다.

docker-compose는 여러개의 image를 손쉽게 관리하기 위한 툴이다


3. docker-compose 설치

docker-compose 파일을 다운로드 한다.

# 1.25.0-rc2는 버전으로 최신 버전으로 받아주면 된다.
# 다운로드 받을 경로를 입력 해주면된다. "/usr/local/bin/docker-compose"
$ sudo curl -L https://github.com/docker/compose/releases/download/1.25.0-rc2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

docker-compose 파일에 권한을 설정해 준다.

$ sudo chmod +x /usr/local/bin/docker-compose

docker-compose가 잘 설치 되어 있는지 확인하기 위해 버전을 확인해 본다.

 $ docker-compose --version
 docker-compose version 1.25.0-rc2, build 661ac20e

 

자세한 설치 방법은 아래의 링크를 참조한다.

https://docs.docker.com/compose/install/

 

Install Docker Compose

 

docs.docker.com

 

이제 docker_web 폴더로 이동하여 docker-compose.yml 파일을 생성해준다.

 

docker-compose.yml

version: '3'
services:

    nginx:
        container_name: nginx
        build: ./nginx
        image: docker/nginx
        restart: always
        ports:
          - "80:80"
        volumes:
          - ./sdn:/srv/django:z
          - ./log:/var/log/nginx:z
        depends_on:
          - django
    django:
        container_name: django
        build: ./django
        image: docker/django
        restart: always
        command: uwsgi --ini /srv/django/uwsgi.ini
        volumes:
          - ./django:/srv/django:z
          - ./django:/var/log/uwsgi:z

docker-compose.yml에서 포트정의를 하고 uwsgi설정도 하기 때문에 uwsgi.ini 파일을 만들고 Dockerfile의 값도 일부 주석 처리를 해준다.

※ 컨테이너 실행시 volumes 경로에 접근 권한 에러가 나올경우 경로 뒤에 :z 를 입력하면 접근이 가능하다.

 

Django Dockerfile

# python 버전 or latest 입력
FROM python:2.7.15			# 도커에 설치될 python 버전

ENV PYTHONUNBUFFERED 1

RUN apt-get -y update
RUN apt-get -y install vim

RUN useradd -r nginx
RUN usermod -a -G root nginx

RUN mkdir /srv/django			# docker안에 srv/django 폴더 생성
ADD . /srv/django			# 현재 디렉토리를 srv/django 폴더에 복사

WORKDIR /srv/django			# 작업 폴더 설정

RUN pip install --upgrade pip
RUN pip install -r requirements.txt	#  python 패키지 설치

# EXPOSE 8000
# django를 단독으로 실행할때 사용 명령어
# 단, nginx를 이용해서 django를 실행할때는 주석처리!!
#CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
# uwsgi를 이용해서 django를 실행할때 사용(테스트용)
#CMD ["uwsgi", "-i", "/srv/sdn/uwsgi.ini"]

 

Nginx Dockerfile

FROM nginx:latest

RUN apt-get -y update
RUN apt-get -y install vim

RUN mkdir /etc/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf
COPY html/ /etc/nginx/html

#EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

이제 django 프로젝트 폴더로 이동하여, uwsgi.ini 파일을 생성해주고 아래와 같이 값을 입력한다.

# ~/docker_web/django/uwsgi.ini
[uwsgi]
project         = django
username        = root
base            = /srv
chdir           = %(base)/%(project)
module          = %(project).wsgi
master          = true
processes       = 10
uid             = %(username)
socket          = /srv/%(project)/%(project).sock
chown-socket    = %(username):nginx
chmod-socket    = 666
vacuum          = true
logto           = /var/log/uwsgi/%(project).log
log-reopen      = true

모든 준비가 끝이 나고 docker-compose 명령어를 이용하여 빌드 및 실행을 하면 된다.

docker-compose는 up/down으로 실행을 시키며 -d 옵션은 데몬으로 실행 되는 옵션이다.

$ docker-compose up -d --build

docker-compose가 실행이 되고 나면 컨테이너가 잘 실행이 되고 있는지 확인한다.

$ docker-compose ps
 
 Name               Command               State         Ports
--------------------------------------------------------------------
django   uwsgi --ini /srv/django/uwsgi.ini   Up
nginx    /docker-entrypoint.sh ngin ...   Up      0.0.0.0:80->80/tcp

url로 접속을 하게 되면 nginx와 django 연결이 된걸 확인 할 수 있다.

 

컨테이너를 내리기 위해서는 down 명령어를 입력해주면 된다.

$ docker-compose down
반응형