DjangoBrothers BLOG ✍️

2019/08/02

このエントリーをはてなブックマークに追加
Django Docker 環境構築

DockerでDjangoを動かしてみる

Dockerを使ってDjangoプロジェクトを動かしてみたいと思います。

Dockerの概要・特徴

かなり簡単にですがまとめておきます。

  • Docker - Docker社が提供する、オープンソースのコンテナ型 仮想化ソフト
    • 仮想化 - 実際のマシンを用意しなくても、仮想的にパソコンやサーバを作れる仕組み(パソコンやサーバーの中に、もう1つマシンを作るようなイメージ。Dockerはそれを「コンテナ型」で行う。)
  • コンテナ - 隔離されたプログラム実行環境。コンテナには、稼働しているコンピュータとDockerがやりとりするための最低限の機能しか含まれていないため、とても軽量。
  • 1アプリ=1コンテナで構成するのが慣例 - データベースを使ったWebシステムを構築する場合は、「Webサーバーを担当するコンテナ」と「データベースを担当するコンテナ」の2つのコンテナを動かし、互いにやり取りして1つのシステムを構成するようにする。こうすることで「 Webサーバーだけをアップデートする」とか「DBサーバーだけをアップデートする」が容易にできる。
  • イメージ - コンテナは「イメージ」から作られる。イメージはコンテナを作る設計図のようなもの。様々な環境用のイメージはDocker Hubに公開されている

DockerでDjangoの開発環境を構築する

Dockerを使ってDjangoの開発環境を作ってみます。

とりあえずDockerでDjangoを動せるようになることを目標にして、極力シンプルにします。設定をシンプルにするため、DB等はデフォルトのものを使います。

手順は以下の通りです。

  1. requirements.txtを作る
  2. Dockerfileを作る
  3. docker-compose.ymlを作る
  4. コンテナを起動してstartproject, startappする
  5. docker-compose up でローカルサーバーを起動する

今回は、ブログアプリを作ると仮定して、blogというディレクトリの中に各種ファイルを作っていきます。

1. requirements.txtを作る

まずはrequirements.txtを作り、使用したいパッケージを記述します。今回はDjangoのパッケージだけです。

~/blog/requirements.txt

django==2.2.2

2. Dockerfileを作る

Dockerfileを作ります。

Dockerfileは、Docker Hubからイメージを取得して、それを元に新たなイメージを作るまでの流れを1つのファイルに記述しておくことができます。 Dockerfileを用いれば、複雑なイメージの作成を簡単にできますし、他のホストOSでもすぐに同じ環境を用意できます。

Dockerfileを使ってイメージを作ることをbuild(ビルド)といいます。

~/blog/Dockerfile

# Docker Hubにあるpythonイメージをベースにする
FROM python:3.6-alpine

# 環境変数を設定する
ENV PYTHONUNBUFFERED 1

# コンテナ内にcodeディレクトリを作り、そこをワークディレクトリとする
RUN mkdir /code
WORKDIR /code

# ホストPCにあるrequirements.txtをコンテナ内のcodeディレクトリにコピーする
# コピーしたrequirements.txtを使ってパッケージをインストールする
ADD requirements.txt /code/
RUN pip install -r requirements.txt

# ホストPCの各種ファイルをcodeディレクトリにコピーする
ADD . /code/

3. docker-compose.ymlを作る

docker-compose.ymlを作ります。

Docker Composeは、コンテナをまとめて操作するための機能です。 コンテナ1つ1つを「docker run」で起動して構築するのは、起動順番を考慮したりオプションを使い分けたりしなければならないため大変です。

Dockerfileが、「1ファイルにつき1つのイメージを作る」だけなのに対して、Docker Composeは「1ファイルでDocker Hubからのイメージの取得と、コンテナの生成や実行を複数同時に行う」ことができます。

docker-compose.yml

version: '3'  # Docker Composeのバージョン
services:
  web:  # コンテナに名前をつける
    build: .  # Dockerfileがあるディレクトリへのパス
    volumes:
      - .:/code  # ホストPCのカレントディレクトリとコンテナ内のcodeディレクトリを同期させる
    ports:
      - "8000:8000"
    command: python manage.py runserver 0.0.0.0:8000

volumes.:/codeとすることで、 ホストPCのカレントディレクトリ(/blog)とコンテナ内の(/code)ディレクトリを同期させているので、どちらかを修正すると、もう一方にも反映されます。

4. コンテナを起動してstartproject, startappする

次にDjangoプロジェクトを作ります。

docker-compose runコマンドでコンテナを起動し、django-admin startproject blogsite .コマンドを実行します。

DockerfileでWORKDIR /codeとしているので、/codeディレクトリの下にDjangoプロジェクトが作られます。

コンテナ内の/codeディレクトリは/blogディレクトリと同期されているので、ホストPC上でもDjangoプロジェクトを確認できます。

~/blog

$ docker-compose run --rm web django-admin startproject blogsite .

同様の方法で、startappmigrateコマンド等も実行できます。

~/blog

$ docker-compose run --rm web django-admin startapp app
$ docker-compose run --rm web python3 manage.py migrate

runコマンドには--rmオプションをつけていますので、コマンドが実行されるとコンテナはすぐ削除されます。--rmオプションをつけ忘れると、コマンドを実行するたびにコンテナが作られて溜まっていくことになります。

5. docker-compose upでローカルサーバーを起動する

最後に、docker-compose upでローカルサーバーを起動します。

~/blog

$ docker-compose up
...
web_1  | Django version 2.2.2, using settings 'blog.settings'
web_1  | Starting development server at http://0.0.0.0:8000/
web_1  | Quit the server with CONTROL-C.

http://127.0.0.1:8000/にアクセスすると、Djangoのページが表示されるはずです。

Makefileを使う

docker-composeのコマンドは長いので、よく使うやつはMakefileにまとめておくと便利です。

~/blog/Makefile

makemigrations:
    docker-compose run --rm web python3 manage.py makemigrations

migrate:
    docker-compose run --rm web python3 manage.py migrate

createsuperuser:
    docker-compose run --rm web python3 manage.py createsuperuser

上にようにしておくと、make makemigrationsdocker-compose run --rm web python3 manage.py makemigrationsが実行されるようになります。

環境変数を設定する

環境変数を設定したい場合は、以下のようにできます。

docker-compose.yml

version: '3'
services:
  web:
    build: .
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    env_file: docker-compose.env  # 追加
    command: python manage.py runserver 0.0.0.0:8000

docker-compose.env

MODE=debug
SECRET_KEY=hogehogehoge

参考

  • 自宅ではじめるDocker入門

Dockerを学ぶにあたってはこの本が良かったです。 応用的なことは扱っていない分、初心者でもわかりやすい丁寧な解説となっています。いくつかのサンプルを実際に動かしながら勉強できます。

ネット記事などを見てもDockerの概要がイマイチ掴めなかった人には良いかと思います。