티스토리 뷰
서론
서버를 이전하거나 불의의 사고로 웹 서버가 중단 되어도 다시 살아날 수 있게끔 도커를 이용해 Django 서버를 이미지화 하는 방법을 소개합니다.
여기에서는 Dockerfile 작성 방법에 대해서 소개합니다. 배포에 필요한 다른 기술들은 다루지 않습니다.
본론
DockerFile
개념
도커 이미지를 만들기 위한 스크립트라고 생각할 수 있습니다. 도커 프로그램은 도커파일에 기술된 대로 명령을 수행하여 적절히 가공된 이미지를 생성할 수 있습니다.
작성법
특별한 확장자가 필요하지 않습니다. 그저 파일명을 Dockerfile로 설정하는 걸로 충분합니다. 도커파일의 기본적인 스크립트는 아래와 같이 작성합니다.
# 파이썬 버전은 https://hub.docker.com/_/python 여기에서 확인할 수 있습니다.
# 시작 이미지 파일을 선택합니다.
FROM python:3.11
# 이미지에서 작업 디렉토리를 설정합니다. 만약 디렉토리가 존재하지 않으면 생성합니다.
WORKDIR /projectname/
# 현재 위치의 데이터를 projectname으로 복사합니다.
ADD . /projectname/
# 이미지 빌드 과정 중에 실행 될 스크립트들입니다.
RUN python -m pip install --upgrade pip
RUN pip install --no-cache-dir -r requirements.txt
RUN python manage.py makemigrations
도커 이미지 빌드
만들어진 도커파일은 이미지 파일이 아닙니다!
위에서 작성한 것은 도커 이미지 파일을 만들기 위한 스크립트에 불과합니다. 따라서 도커 이미지 파일을 만들기 위해서는 빌드 과정이 필요합니다.
도커 파일이 있는 디렉토리에서 다음 명령어를 수행하면 빌드가 수행됩니다.
docker build .
-t 옵션을 추가하면 이미지 이름을 지정할 수 있습니다. (만약 지정하지 않으면 이미지의 해쉬코드를 사용해야 하기 때문에 하는 것을 추천합니다.) 일반적으로 이미지 이름은 슬래시(/)기호로 구분해서 나타냅니다. 예) 회사/프로젝트. 단, 무조건적인 것은 없기 때문에 상황에 맞게 선택하는 것이 필요합니다.
docker build -t dailab/apop .

dockerfile에 작성된 스크립트대로 차례로 수행되는 것을 확인할 수 있습니다.
Docker Compose
개념
도커 컴포즈는 도커 컨테이너들을 관리하는 도구입니다. 하나의 이미지를 컨테이너로 올리는 것은 쉬운 일입니다. 하지만 컨테이너로 올려야 하는 이미지가 여러개 존재한다고 할 때에는 사정이 달라집니다.
컨테이너로 올려야 하는 이미지들의 순서와 공유해야 하는 자원들(스토리지, 네트워크 등)을 매번 수행해야 하는 귀찮음을 해결해주는 것이 도커 컴포즈입니다.
작성법
도커 컴포즈 파일은 파일명을 docker-compose.yml로 설정하면 됩니다.
Django 만으로는 배포 시에 static 파일을 전달할 수 없기 때문에 Nginx를 이용해야 합니다.
version: "3.7"
# 컨테이너로 띄울 이미지들을 작업합니다.
services:
nginx:
# 이미지 파일을 선택합니다.
image: nginx:1.25.3
# 같은 네트워크 상에서 존재하기 위해 설정합니다.
networks:
- network
# 왼쪽은 local, 오른쪽은 container입니다.
# 마운트(mount)가 필요한 경로의 맵핑을 나타냅니다.
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./static:/data/static
# 바인드(bind)가 필요한 포트의 맵핑을 나타냅니다.
ports:
- 80:80
# 컨테이너가 생성될 순서를 지정합니다. depends_on 에 있는 컨테이너가 생성된 후에 생성됩니다.
depends_on:
- apop
apop:
image: dailab/apop
container_name: apop
networks:
- network
volumes:
- ./static:/djangoproject/static
#
command: >
bash -c "
python3 manage.py migrate&&
gunicorn apop2.wsgi -b 0.0.0.0:8000"
# networks 외부의 다른 호스트들에게도 포트를 개방합니다.
ports:
- "8000:8000"
# networks 내부에 다른 호스트들에게 포트를 개방합니다.
expose:
- "8000"
networks:
# 이름은 network가 아니라 다른 걸로 해도 괜찮습니다. 대신 위에도 그걸로 수정해야 합니다.
network:
버전의 의미
https://docs.docker.com/compose/compose-file/compose-versioning/
도커 버전과의 호환성을 의미하는 것 같습니다.
실행
파일을 모두 작성했다면 다음 명령어를 통해 도커 컴포즈 파일에 설정된 대로 컨테이너를 올릴 수 있습니다.
docker compose up

2 개의 이미지가 제대로 올라온 것을 확인할 수 있습니다.
결론
도커 파일과 컴포즈 파일들을 공유하면 다른 머신에서도 손쉽게 배포가 가능해집니다. 또한 서비스가 여러 개의 서브 시스템으로 나뉘어져 컨테이너 형식으로 동작하기 때문에 효율적으로 관리가 가능하다는 장점이 있습니다.
직접 써보니 생각보다 쉽고 편리했습니다. 업계에서도 많이 사용하는 만큼 자주 사용해보고 익히면 좋을 것 같습니다.
'개발자 > 파이썬(Python)' 카테고리의 다른 글
| [Django] Docker 컨테이너에서 createsuperuser 사용 (0) | 2024.01.17 |
|---|---|
| [Django] Django와 MySQL 혹은 MariaDB Docker로 연결 (0) | 2024.01.17 |
| [Django] static 파일 사용 (0) | 2024.01.15 |
| [Django] CSV 파일 전송 뷰 만들기 (1) | 2024.01.03 |
| [Django] AUTH_USER_MODEL과 get_user_model() (0) | 2024.01.01 |
