きっとうまく行く Django on Docker
サクッとやりたいもののなんだかんだつまづく Docker 。
以下では、
- Django
- PostgreSQL
な開発環境を Docker で構築する手順を記します。
また、以下の Docker 構成は、開発環境のみを想定し、本番までのデプロイは想定していません。
docker-compose インストール
以下の URL を参考にインストールしてください。
https://docs.docker.com/docker-for-mac/install/
$ docker --version
Docker version 17.03.0-ce, build 60ccb22
$ docker-compose --version
docker-compose version 1.11.2, build dfed245
以上のようになればインストール完了です。
Django プロジェクトを動かすぞ
https://github.com/kyon-bll/Django-on-Docker
こちらのリポジトリをクローンしてきます。以下は、このリポジトリ内で作業してください。
Django 用の Docker イメージを Dockerfile から作成
$ docker-compose build
ざっくり以下のようなことをやっています。
- Python のイメージをダウンロード
- ダウンロードしたイメージに
pip
を用いてrequirements.txt
に記述のあるdjango
パッケージをインストール
Django プロジェクトを作成
$ docker-compose run web django-admin startproject django_project_name .
最後の .
を忘れないように注意してください。
このコマンドで、 Django プロジェクトに関するファイルが作成されます。
1. django_project_name ディレクトリ
2. manage.py ファイル
また、docker-db-data ディレクトリには PostgreSQL のデータが配置されます。
起動
$ docker-compose up
http://localhost:8000/ にアクセスして、以下の画面が表示されれば完了です。
DB 設定
django_project_name
ディレクトリ内の settings.py
の DATABASES の記述を PostgreSQL 用に書き直します。
...
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'PASSWORD': 'postgres',
'HOST': 'db',
'PORT': 5432,
}
}
...
$ docker-compose exec web python manage.py migrate
migrate に成功すれば完了です。
以降の操作
# docker コンテナ停止
$ docker-compose down
# pip インストール, requirements.txt 更新
$ docker-compose exec web pip install {パッケージ名}
$ docker-compose exec web pip freeze > requirements.txt
# manage.py コマンド
$ docker-compose exec web python manage.py createsuperuser
$ docker-compose exec web python manage.py makemigration
$ ...
その他の設定箇所とか
- Django のバージョン指定: requirements.txt でバージョンの指定をする
- Python のバージョン指定: Dockerfile の1行目
- PostgreSQL のバージョン指定: docker-compose.yml の17行目
- apt-get でのパッケージインストール: Dockerfile コメントアウト箇所参照
wait-for-db.sh て何
DB の準備ができる前に Django から DB へアクセスがあると、エラーで動かなくなってしまうのを防いでいます。
docker-compose.yml の depends_on
の記述によって、DB -> Django の順に起動はしてくれるのですが、DB の準備が整うまでは待ってくれないので、環境によってこれがないとうまく動かないことがあります。というか自分はほぼ毎回そうなります。なんとかもうちょっと綺麗に解決したい。