장고(Django) 공식 이미지로 설명하는 도커(Docker)의 기본적인 사용법

Posted by Siner on February 16, 2019

이번 장에서는 Django 공식 이미지를 사용하여 Docker의 기본 개념에 대해 설명하겠습니다.
Custom 이미지를 생성하여 Django를 배포하는 방법에 대해서는 다음 장에서 다루겠습니다.


0) Docker

Docker란 무엇입니까?

Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다. Docker는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있습니다. Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있습니다.


1) Docker Hub

Docker Hub에서는 컨테이너 이미지를 받아서 사용하고, 자신만의 이미지를 만들어서 업로드 할 수도 있습니다.
프로젝트에 사용할 Django 이미지를 얻기 위해 hub.docker.com에 접속하여 Django를 검색해보면 Docker에서 공식적으로 지원하는 Django 이미지를 확인할 수 있습니다. image

아래의 Description 내용을 살펴보면 Django 이미지가 2016년 말에 Deprecated되었음을 확인할 수 있습니다. image

Deprecated되었다는 것은, 직접 Django 이미지를 만들지 않는 이상은 Docker에서는 새로운 버전의 Python과 Django를 사용할 수 없게 되었다는 것을 의미합니다.
일단 이번 포스팅에서는 기존의 Django 이미지를 사용해서 배포함으로써, Docker의 기본적인 사용방법에 대해 다뤄보겠습니다.


2) Dockerfile

이미지를 불러와서 run하기 전에, 이미지가 어떻게 구성되어있는지 Dockerfile을 한번 살펴볼 필요가 있습니다.

Dockerfile reference

Docker는 Dockerfile을 읽어 자동으로 이미지를 작성할 수 있습니다. Dockerfile은 이미지를 어셈블하기 위해 사용자가 명령 줄에서 호출 할 수있는 모든 명령을 포함하는 텍스트 문서입니다.
docker build를 사용하면 몇 가지 명령을 연속적으로 실행하는 자동화 된 빌드를 만들 수 있습니다.

아래 내용은 Django 공식 이미지의 Dockerfile 입니다.
마지막 CMD 명령어에서 python manage.py runserver 0.0.0.0:8000명령어를 사용하는 것을 확인할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Dockerfile

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 . .

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

3) Dockerfile 없이 Django를 띄워보자

Django 공식 이미지를 가져와서 빌드 해보도록 합시다.

1
docker run --name my_django_container -v "$PWD":/usr/src/app -w /usr/src/app -d -p 8000:8000 django bash -c "pip install django && django-admin startproject mydjangoproject && cd mydjangoproject && python manage.py runserver 0.0.0.0:8000"

위의 명령어는 다음과 같은 뜻을 지닙니다.

  • docker run : Docker 이미지를 실행합니다. (local에 이미지가 없으면 pull 하고 실행.)
  • --name my_django_container : 컨테이너 이름은 my_django_container 으로 합니다.
  • -v "$PWD":/usr/src/app : 호스트의 $PWD(현재 경로)와 컨테이너의 /usr/src/app을 연결해줍니다.
  • -w /usr/src/app : 컨테이너 내부의 워킹 디렉토리를 /usr/src/app 으로 설정합니다.
  • -d : 해당 명령어를 백그라운드로 실행시키고, 컨테이너 ID를 리턴합니다.
  • -p 8000:8000 : 호스트의 8000번 포트(앞)와 컨테이너의 8000번 포트(뒤)를 연결해줍니다.
  • django : 타겟 이미지를 django:latest로 합니다. (뒤에 태그를 생략하면 latest를 가져와서 실행함)
  • bash -c : 뒤의 명령어를 컨테이너 안에서 실행시킵니다.

4) ALLOWED_HOSTS

image

하지만 지난번과 마찬가지로 ALLOWED_HOSTS에러가 나타났네요.
프로젝트를 생성하고 아무것도 안했으니 그럴 수밖에요!

하지만 우리는 -v와 -w 옵션을 통해서 컨테이너 내부에서 생성된 Django 프로젝트를 컨테이너 밖에서도 접근 가능하게 했기 때문에, 수정하여 반영하는 것이 가능합니다.

settings.py 에서 ALLOWED_HOSTS 부분을 수정해주도록 합니다.

5) 결과

image

수정 결과 제대로 된 화면이 나타나는 것을 확인할 수 있습니다.

이전의 로켓모양이 아닌 밋밋한 화면으로 나타나는 것은 Deprecated상태인 Django 이미지에서 사용한 Python 3.4.5때문입니다. Python 3.4.5를 사용함으로써 Django 1.10.4가 설치되었고, 오래된 버전의 빌드화면이 나타나네요.

다음 시간에는 이러한 버전문제를 해결하기 위해 나만의 Django 이미지 만들기를 해보도록 하겠습니다.