장고로 만든 프로젝트를 도커 컨테이너로 옮기는 과정을 정리하였다.
도커 설치 과정은 아래 글을 참조해 주길 바란다.
설치된 도커는 docker -v 명령어를 통해 버전을 확인할 수 있다.
장고 프로젝트를 진행하면서 설치했던 모든 라이브러리들은 가상환경에 저장되어 있다.
이 모든 것들을 도커 컨테이너로 이동하기 위해 아래 명령어를 입력해 지금까지 가상환경에 설치했던 라이브러리들을 리스트로 만들어 저장한다.
pip freeze > requirements.txt
dir을 통해 requriements.txt가 만들어진 것을 볼 수 있고, 이 파일을 열어보면 지금까지 프로젝트에 사용한 모듈들이 나열되어 있는 것을 볼 수 있다.
이제 도커 설정 파일을 만든다.
먼저 프로젝트 파일에 Dockerfile 이름으로 파일을 만들고 다음과 같이 작성한다.
이때 첫 번째 줄의 FROM python: 에는 본인 컴퓨터에 설치된 파이썬 버전을 작성한다. 필자는 3.9.12 버전이 설치되어 있어 3.9.0으로 입력하였다.
# pull official base image - 도커는 파이썬이 설치되어 있는 이미지를 불러옴(설치된 파이썬 버전 작성)
FROM python:3.9.0-slim-buster
# set work diretory - 프로젝트의 작업 폴더 지정
WORKDIR /usr/src/app
# set envireonment variables -.pyc 파일을 생성하지 않도록 하고, 버퍼링없이 출력하게 함
ENV PYTHONDONTWRITEBYECODE 1
ENV PYTHONUNBUFFERED 1
# 현재 위치(Dockerfile이 있는 위치)에 있는 파일을 WORKDIR로 복사
COPY . /usr/src/app/
#install dependencies - requirements.txt에 나열된 라이브러리 설치
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
그다음으로 도커 컴포즈 파일을 만든다. 도커 컴포즈 파일을 사용하면 컨테이너 여러 개를 한 번에 실행시킬 수 있고, 컨테이너를 실행시킬 때 옵션도 줄 수 있다.
프로젝트 폴더에 docker-compose.yml 파일을 만들고 다음과 같이 작성한다.
version: '3'
services:
web:
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- ./:/usr/src/app/
ports:
- 8000:8000
env_file:
- ./.env.dev
다음으로, setting.py의 SECRET_KEY와 DEBUG를 다음과 같이 수정한다.
기존 SECRET_KEY에 작성되어 있는 것을, os.environ.get('SECRET_KEY', 기존 내용)로 수정해 주면 된다.
마지막으로 프로젝트 폴더에 .env.dev 파일을 만들어 다음과 같이 작성한다.
DEBUG = 1
SECRET_KEY = setting.py에 있던 SECRET_KEY를 복사해옴
DJANGO_ALLOWED_HOSTS = localhost 127.0.0.1 [::1]
이제 터미널에서 docker-compose build 명령어로 이미지를 만든다.
이 과정에서 오류가 굉장히 많이 발생했는데 오타가 없는지 먼저 확인해 보길 바란다.
upgrade앞에 -이 아닌 --이 맞는지, 작성한 파이썬 버전이 설치된 버전과 같은지 확인해 보면 큰 문제는 없을 것이다.
그다음으로 docker-compose up 명령어로 컨테이너를 실행한다.
컨테이너가 실행되면 웹 브라우저에서 127.0.0.1:8000으로 접속했을 때 정상적으로 실행되는 것을 볼 수 있다.
터미널에서 ctrl+c를 누르면 python manage.py runserver를 했을 때와 같이 서비스가 멈춰, 브라우저로 들어가 봐도 접속이 되지 않는다.
docker-compose up -d를 입력하면 정상적으로 작동하는 웹 사이트를 볼 수 있다.
컨테이너를 실행시키되 -d 옵션으로 백그라운드에서 돌아가도록 하기 때문에 터미널을 닫아도 웹사이트는 정상적으로 작동한다.
현재 도커에 생성된 이미지를 확인하기 위해 docker image ls를, 실행 중인 컨테이너를 확인하기 위해 docker container ls를 입력했다.
도커 컨테이너 안에서 테스트를 하기 위해 python manage.py test 명령을 실행해 보면 아무 문제가 없어 OK가 출력되는 것을 볼 수 있다.
docker-compose exec web python manage.py test
docker-compose down으로 백그라운드에서 실행되고 있던 컨테이너를 중단시킬 수 있으며, 중단시킨 후에는 실행 중인 컨테이너가 없는 것을 볼 수 있다.
참고: Do it! 장고+부트스트랩 파이썬 웹 개발의 정석