나만의 도커(Docker) 이미지를 만들어서 장고(Django) 서비스 배포하기

2019/02/25

저번 장에서는 Django 공식 도커 이미지를 확인해보았고, Deprecated되었음을 확인했습니다.
이번 장에서는 나만의 Django 이미지를 직접 만들어서 배포해보고, docker hub에 업로드까지 해보겠습니다.

본 포스팅의 프로젝트 소스아래의 링크를 통해 얻을 수 있습니다.
github.com/siner308/django-with-custom-image

docker


0) Dockerfile

도커 이미지를 만들기 위해서는 Dockerfile이 필요합니다. Dockerfile 작성의 힌트를 얻기 위해, Django의 공식 Dockerfile을 확인해봅니다.

Official Dockerfile (Deprecated)

FROM python:3.4

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        postgresql-client \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /usr/src/app
COPY requirements.txt ./
RUN pip install -r requirements.txt
COPY 2019-02-25-django-docker-custom-image .

EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

아래는 제가 만든 Dockerfile입니다. 위의 Deprecated 버전과는 다르게 python3.6을 기반으로 하여 Django 2.0 이상의 버전을 사용하도록 하였습니다.

My Dockerfile

FROM python:3.6

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
       postgresql-client \
    && rm -rf /var/lib/apt/lists/*

COPY . /app  # 나의 Django 코드를 컨테이너에 복사합니다.
RUN pip install -r /app/requirements.txt  # requirements.txt에 적혀있는 pip 패키지들을 설치합니다.
RUN chmod 755 /app/start  # start 파일을 실행 가능하게 합니다.
WORKDIR /app  # 워킹디렉토리를 /app으로 합니다.
EXPOSE 8000  # 8000번 포트를 expose합니다.

ENTRYPOINT ["/app/start"]  # /app/start 파일을 실행시킵니다.

1) ENTRYPOINT

위의 Dockerfile 맨 마지막 줄을 살펴보면, ENTRYPOINT ["/app/start"] 라는 명령어가 있습니다.
컨테이너를 실행할 때 /app/start를 실행하라는 것을 의미합니다.

ENTRYPOINT는 Dockerfile 하나에 한번밖에 호출할 수 없는데, 파일을 사용함으로써 여러 명령어를 한번에 실행시킬 수 있게 합니다.

start

#!/bin/bash

python manage.py makemigrations
python manage.py migrate

python manage.py runserver 0.0.0.0:8000

위와 같이 start 파일에는 데이터베이스 마이그레이션배포 명령어가 함께 들어있습니다.
Django 명령어를 하나의 파일로 따로 관리함으로써, Dockerfile을 자주 변경하는 일이 줄어들게 됩니다.


2) docker build

Usage - docker build

docker build [OPTIONS] PATH | URL | -

이제 Dockerfile과 start 파일을 중심으로 나만의 Django 이미지를 만들어보겠습니다.
우선 Dockerfile이 있는 위치로 이동한 다음, 아래의 명령어를 입력합니다.

docker build

docker build -t dockerdjango .

docker build 명령어를 입력한 후, -t 옵션을 넣으면 생성될 이미지의 이름(태그)를 지정할 수 있습니다.
저의 경우에는 이미지의 이름을 dockerdjango로 지정하였습니다.

그 뒤에있는 .Dockerfile과 컨텐츠가 있는 경로입니다.
Dockerfile이 있는 위치에서 실행하기 때문에 현재경로. 을 입력해줍니다.

docker images명령어를 이용해서 dockerdjango:latest라는 이름의 이미지와,
Base 이미지인 python:3.6이 있는 것을 확인할 수 있습니다.


3) docker run

Usage - docker run

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

방금 생성한 이미지를 배포해보도록 하겠습니다.
8000번 포트를 열어 주었기 때문에, -p 8000:8000 옵션을 넣어주겠습니다.

docker run

docker run -d -p 8000:8000 --name dockerdjango dockerdjango:latest
OPTION DESCRIPTION
-d 백그라운드 실행
-p <host port>:<container port> 호스트와 컨테이너의 포트를 매핑
--name <container name> 컨테이너의 이름을 지정
<image name>:<image tag> 이미지의 이름과 버전을 지정

4) docker hub에 업로드

Usage - docker login

docker login [OPTIONS] [SERVER]

Usage - docker tag

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

Usage - docker push

docker push [OPTIONS] NAME[:TAG]

이제 위의 login, tag, push 명령어를 활용하여 나만의 이미지를 다른 곳에서도 사용할 수 있게 docker hub에 업로드해 보도록 하겠습니다.

docker login, tag, push

docker login
docker tag dockerdjango:latest aan308/dockerdjango:latest
docker push aan308/dockerdjango:latest

image

성공적으로 업로드 됐습니다.


5) docker hub 이미지로 run 하기

docker hub에 공개적으로 업로드 된 이미지는 어디서든 pull 받아서 사용할 수 있습니다.
docker run 커맨드 시, local 저장소에 해당 image가 없다면, 자동으로 pull을 실행합니다.

docker run with remote image

docker run -d -p 8000:8000 --name dockerdjango aan308/dockerdjango:latest

6) Result

image

배포에 성공하였습니다.


다음편에서는 docker-compose를 사용하여 PostgreSQLDjango를 함께 배포하는 방법에 대해 적어보겠습니다.