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/
이제 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
'프로그래밍 개발(Development) > Docker' 카테고리의 다른 글
Docker Private(local) Registry 구축하기(ubuntu 20.04) (2) | 2022.06.09 |
---|---|
RUN, CMD, ENTRYPOINT 명령어의 개념과 차이점 (1) | 2022.05.09 |
Docker log file 주기적으로 삭제 및 관리(logrotate 사용) (0) | 2022.02.28 |
Docker, Docker-compose 수동 설치(Centos, ubuntu) (0) | 2022.02.23 |
Docker 명령어 정리 (0) | 2021.08.16 |