이번 시리즈는 기존에 존재하는 장고 프로젝트나, 새로 시작하는 프로젝트를 Docker-compose를 활용하여 도커라이징 하는 과정에 대해서 올릴 것이다. 일반적으로 Django에 Postgres, Nginx, Redis, RabbitMQ, Celery와 같은 것들을 붙여서 사용하기 때문에 이에 대해서 순차적으로 진행할 예정이다.
이번 포스트에서는 Django 프로젝트를 컨테이너로 띄워보는 것이 목표이다. 기존에 진행중인 프로젝트를 가지고 있는 사람이면 그대로 진행하면 될 것이고 새롭게 프로젝트를 시작하는 사람이라면 프로젝트와 앱을 생성한 후 정상적으로 장고 서버가 실행되는 상태에서 작업하면 된다.
도커 데스크탑 설치
해당 포스팅의 환경은 Mac을 기준으로 할 것이다. 아래의 링크에서 도커 데스크탑을 설치하자.
https://www.docker.com/products/docker-desktop
이제 부터 진행할 것은 Dockerfile 이다. Dockerfile이 무엇이고 어떻게 작성하는지에 대해서 알아보자.
Dockerfile 이란?
Dockefile은 컨테이너에 설치해야 하는 패키지, 소스코드, 명령어, 환경변수설정 등의 과정을 기록한 하나의 파일이다. 이 파일이 있는 폴더에서 도커로 빌드하게 되면 이미지가 생성된다. 우리는 생성된 이미지를 가지고 컨테이너를 실행할 수 있다.
즉, 이 파일에 작성해야 할 것은 맨처음 서버를 세팅하는 여러 과정들을 나열하면 되는 것이다.
Dockerfile 작성법
다음은 우리가 실제로 사용할 Dockerfile의 내용이다.
# docker hub에 존재하는 ubuntu 16.04 버전의 이미지를 base로 사용
FROM ubuntu:16.04
# 우부투 기본 세팅
RUN apt-get update
RUN apt-get install -y software-properties-common
RUN add-apt-repository -y ppa:deadsnakes/ppa
# 파이썬 3.6 설치
RUN apt-get update
RUN apt install -y python3.6
RUN apt install -y python3-pip
RUN apt install -y python3.6-dev libpq-dev
# 파이썬 default version 3.5 -> 3.6 설정
RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 1
RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2
RUN update-alternatives --config python3
# net-tools, dnsutils 설치
RUN apt-get install -y net-tools
RUN apt-get install -y dnsutils
RUN apt-get update
# 파이썬 출력 버퍼 제거
ENV PYTHONUNBUFFERED 0
# 작업 디렉토리를 아래와 같이 설정
WORKDIR /home/프로젝트명
# requirements.txt 설치
COPY requirements.txt /home/프로젝트명
RUN pip3 install --upgrade pip
RUN pip3 install -r requirements.txt
# postgres를 위한 대기 스크립트, 추후에 설명
ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /
우선 베이스 이미지로 우분투 16.04 버전을 활용하였으며, 파이썬은 3.6.1 버전을 설치하였다. 그 후 프로젝트에 사용되는 requirements.txt를 통해 여러 라이브러리들을 설치한다. 마지막줄에 적힌 내용은 postgres와 관련한 것인데 추후에 다시 설명할 예정이다.
여기까지 작성한 내용을 자신이 진행하고 있는 프로젝트의 root 디렉토리에 위치시킨다.
Dockerfile의 작성을 완료하였으니 실제로 도커 이미지로 빌드하는 과정을 거쳐야 한다. 도커에서 사용되는 기본 명령어는 다음과 같다.
Docker 기본 명령어
# 이미지 관련
# 이미지 목록보기
$ docker images
# 이미지 검색
$ docker search [이미지 이름]
# 이미지 받기
$ docker pull [이미지 이름]:[버전]
# 이미지 삭제
$ docker rmi [이미지 id]
----------------------------------------------------------------
# 컨테이너 관련
# 컨테이너 목록 보기
$ docker ps
# 컨테이너 실행
$ docker run [options] image[:TAG|@DIGEST] [COMMAND] [ARG..]
# 컨테이너 시작
$ docker start [컨테이너 id or name]
# 컨테이너 재시작
$ docker restart [컨테이너 id or name]
# 컨테이너 접속
$ docker attach [컨테이너 id or name]
# 컨테이너 정지
$ docker stop [컨테이너 id or name]
# 컨테이너 삭제
$ docker rm [컨테이너 id or name]
----------------------------------------------------------------
# 이미지 빌드 관련
도커 이미지 빌드
- Dockerfile이 위치한 디렉토리에서 다음과 같은 명령어를 입력하면
leffe 라는 도커 이미지 파일이 생성된다.
$ docker build -t [ 생성할 이미지 이름 ex)leffe ] .
우리는 방금 작성한 Dockerfile에 대한 이미지를 빌드해야 하므로 $ docker build -t django . 명령어를 Dockerfile이 위치한 곳에서 실행시켜 준다. 그 후 $ docker images 명령어를 통해 방금 생성된 이미지를 확인할 수 있다.
이로써 django를 컨테이너화 시키기 위한 이미지 생성을 완료한 것이다. 이 이미지를 $ docker run 함으로써 컨테이너를 실행할 수 있다.
Docker-compose.yml 이란?
지금까지 Django를 위한 이미지 파일을 만들었고 컨테이너로 실행도 해보았다. 하지만 앞으로 Django 이외에도 Postgres, Redis, RabbitMQ ... 등 컨테이너로 만들어야 할 것들이 많이 남아있다.
그렇다면 이럴때마다 각각 run 명령어를 통해 컨테이너를 실행해야 하는 것일까? No.
Docker-compose 란 여러 개의 docker를 정의하고 실행하는 툴이다. 즉, 일일히 컨테이너를 run할 필요 없이 docker-compose.yml 이란 파일에 각각 실행할 컨테이너들을 명시해 주면 되는 것이다.
Docker-compose.yml 작성법
복수 개의 컨테이너를 하나의 명령어로 띄우기 위한 docker-compose.yml 파일을 작성하는 방법을 알아볼 것이다.
docker-compose.yml
# yml 파일 포맷의 version 설정
version: "3"
# docker-compose 볼륨 정의
volumes:
postgres_db_dev: {}
# 띄울 컨테이너 목록
services:
# Database container, 추후에 설명
postgres:
container_name : postgres_service
image: postgres:9.5
volumes:
- postgres_db_dev:/var/lib/postgresql/data
environment:
- POSTGRES_DB=leffedb
- POSTGRES_USER=leffe
- POSTGRES_PASSWORD=leffe
- POSTGRES_INITDB_ARGS=--encoding=UTF-8
# Django container
django:
# 컨테이너 명
container_name : django_service
# docker build 옵션
build:
# docker build 명령어를 실행할 디렉토리 경로
context: .
# 지정할 Dockerfile 경로
dockerfile: ./Dockerfile
# 환경 변수 설정
environment:
- POSTGRES_DB=leffedb
- POSTGRES_USER=leffe
- POSTGRES_PASSWORD=leffe
- POSTGRES_HOST=postgres
- POSTGRES_PORT=5432
# 현재 디렉토리를 컨테이너 내의 /home/에 mount
volumes:
- ./:/home/
# 작업 폴더 지정
working_dir : /home/
# 실행할 명령어
command: >
bash -c "
chmod +x /wait-for-it.sh
&& /wait-for-it.sh postgres:5432 -t 10
&& python3 manage.py migrate
&& python3 manage.py runserver"
# 호스트 OS와 컨테이너의 포트를 바인딩
ports:
- "8000:8000"
# 호스트 OS에 포트를 공개하지 않고 컨테이너만 포트를 공개 (현재는 주석)
#expose :
# - "8000"
기본적으로 Django 와 Postgres를 컨테이너로 띄울 때의 docker-compose.yml을 작성해 보았다. 우리는 아직 postgres를 진행하지 않을 것이기에 volumes 와 services의 postgres 항목을 전부 지워주도록하자. 또한, command 부분의 wait-for-it.sh 스크립트 실행도 지워주도록 한다. 마찬가지로 이 파일역시 프로젝트의 root 디렉토리에 위치시킨다.
Django를 docker-compose로 띄우기 위해 필요한 파일의 작성하는 방법을 알아보았다. 이제 직접 명령어를 통해 컨테이너를 실행시켜 보자.
docker-compose 기본 명령어
# docker-compose.yml 파일의 내용에 따라 이미지를 빌드하고 서비스를 실행함
$ docker-compose up -d
# 현재 환경에서 실행 중인 각 서비스의 상태를 보여줌
$ docker-compose ps
# 서비스를 멈추거나, 시작함
$ docker-compose stop 또는 docker-compose start
# 서비스를 지움, 컨테이너와 네트워크를 삭제함. 옵션에 따라 볼륨(postgres)도 지움
$ docker-compose down --volume
# 실행 중인 컨테이너에서 명령어를 실행
$ docker-compose exec puddlr ./manage.py makemigrations
# 서비스의 로그를 확인할 수 있음
$ docker-compose logs -f django
# 이런식으로 alias를 등록하여 이용하면 편리하다.
alias dc="docker-compose"
alias dcb="docker-compose build"
alias dce="docker-compose exec"
alias dcp="docker-compose ps"
alias dcr="docker-compose run"
alias dcu="docker-compose up"
alias dcd="docker-compose down"
alias dcl="docker-compose logs"
alias dclf="docker-compose logs -f"
위의 과정까지 모두 이해하고 Dockerfile, docker-compose.yml 파일의 작성을 완료하였다면 $ docker-compose up -d로 한 번의 명령어를 통해 Django 컨테이너를 띄울 수 있다. 해당 명령어를 실행시키고 127.0.0.1:8000에 접속하면 실제로 Django가 잘 구동되고 있는 모습을 확인할 수 있다.
공부하면서 정리한 내용이니 틀린 부분이 있을 수 있습니다. 댓글로 남겨주시면 감사하겠습니다.
'SW개발 > Django' 카테고리의 다른 글
[Django]Docker-compose로 Django 환경 구축하기 3 - Redis (0) | 2021.06.06 |
---|---|
[Django]Docker-compose로 Django 환경 구축하기 2 - Postgres (0) | 2021.05.31 |
[Django]추천하는 모듈 import 순서 (0) | 2021.05.07 |
[Django]DRF SerializerMethodField() 란? (0) | 2021.05.06 |
[Django]FBV vs CBV (함수형 뷰 vs 클래스형 뷰) (0) | 2021.05.03 |