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等はデフォルトのものを使います。
手順は以下の通りです。
- requirements.txtを作る
- Dockerfileを作る
- docker-compose.ymlを作る
- コンテナを起動して
startproject
,startapp
する 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 .
同様の方法で、startapp
、migrate
コマンド等も実行できます。
~/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 makemigrations
でdocker-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の概要がイマイチ掴めなかった人には良いかと思います。