この記事ではDocker Composeを利用したDjangoの開発環境構築を行います。
使用するOSおよびPython等のバージョンは以下の通りです。
- Mac OS
- Python3.7
- Django2.1.11
- MySQL5.7
作成する環境はNginxのwebサーバ、DajngoのアプリケーションサーバとMySQLのデータベースサーバの3つのコンテナを作成します。
(コンテナを3つ作成するのはそれぞれのコンテナでデータベースとWEBアプリケーション、Webサーバをそれぞれ動作させるためです。)
1. ディレクトリ作成
まず、任意のディレクトリを作成します(この例ではex_djangoというディレクトリを作成します)。
作成したディレクトリの直下にdockerディレクトリを作成し、その下にmysql,sql,nginx,pythonというディレクトリを作成します。
4つのディレクトリを作成するのはコンテナごとに設定ファイルを分けて分かりやすくするためです。
$ mkdir ex_django
$ cd ex_django
$ mkdir docker
$ cd docker
$ mkdir mysql
$ mkdir sql
$ mkdir nginx
$ mkdir python
この時点でのディレクトリ構成が以下のようになります。
ex_django (作業ディレクトリ)
├── docker-compose.yml
├── docker
│ ├── mysql
│ ├── nginx
│ ├── python
│ └── sql
2. docker-compose.ymlの作成
ex_django/docker-compose.yml
を以下の内容で作成します。
今回は、python, nginx, mysqlの3つのコンテナを作成します。
version: '3'
services:
nginx: # WEBサーバのコンテナの設定
image: nginx:1.13 # 使用するコンテナのイメージ名を記述
ports:
- "8000:8000" # ホストの8000ポートとコンテナの8000ポートを接続します。
volumes:
- ./docker/nginx/conf:/etc/nginx/conf.d # nginxの設定ファイルをマウントします。
- ./docker/nginx/uwsgi_params:/etc/nginx/uwsgi_params # nginxの設定ファイルをマウントします。
- ./static:/static # 静的ファイルのディレクトリをマウントします。
depends_on:
- python # アプリケーションサーバが起動してから起動させるため、アプリケーションサーバ用のコンテナとの依存関係を記述します。
db: # DBサーバのコンテナの設定
image: mysql:5.7 # 使用するコンテナのイメージ名を記述
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci # コンテナ起動時のコマンドを記述
ports:
- "3306:3306" # ホストの3306ポートとコンテナの3306ポートを接続します。
environment: # 環境変数の設定を行います。
MYSQL_ROOT_PASSWORD: root # データベースのルートパスワード
MYSQL_DATABASE: database # データベース名
MYSQL_USER: user # データベースのユーザー名
MYSQL_PASSWORD: password # データベースのパスワード
TZ: 'Asia/Tokyo' # タイムゾーンの設定
volumes:
- ./docker/mysql:/var/lib/mysql # データベースのデータを永続化するためにホストのボリュームをマウント
- ./docker/sql:/docker-entrypoint-initdb.d # データベースの設定ファイルをマウント
python: # アプリケーションサーバの設定
build: ./docker/python # ex5_3/docker/python/Dockerfileを使用してイメージをビルドするための設定
command: uwsgi --socket :8001 --module app.wsgi --py-autoreload 1 --logto /tmp/mylog.log # コンテナ起動時のコマンド
volumes:
- ./src:/code # djangoのアプリケーションファイルを保存するためのディレクトリをマウント
- ./static:/static # 静的ファイルのディレクトリをマウントします。
expose:
- "8001" # 公開するポートの設定
depends_on:
- db # DBサーバとの接続の設定
上記のdocker-compose.yml
の中で特に重要な点は、ports
の設定とdepends_on
の設定になります。
ports
はホストのポートとコンテナのポートを接続する設定になります。
depends_on
はコンテナ間の依存関係を設定する構文です。上記のファイルでは、
nginx: # WEBサーバのコンテナの設定
depends_on:
- python # アプリケーションサーバが起動してから起動させるため、アプリケーションサーバ用のコンテナとの依存関係を記述します。
python:
depends_on:
- db # DBサーバとの接続の設定
としており、dbコンテナ、pythonコンテナ、nginxコンテナの順番にコンテナが起動します。
3. Dockerfile作成
Python用のコンテナのDockerfileを作成します。
ex_django/docker/python/Dockerfile
にファイルを作成し、以下の内容を記述します。
# ベースとなるイメージの指定
FROM python:3.7
RUN mkdir /code
WORKDIR /code
# インストールするライブラリを記述したファイル(requirements.txt)をコピー
ADD requirements.txt /code/
# ファイルに記載されたライブラリをインストールするためのコマンド
RUN pip install -r requirements.txt
ADD . /code/
4. requirements.txtの作成
コンテナのPythonにインストールするライブラリを記述するため、
ex_django/docker/python/requirements.txt
に以下の内容を記述します。
Django==2.1.11
uwsgi==2.0.17
PyMySQL==0.9.3
5. nginx設定ファイル作成
Nginxの設定ファイルを作成します。
設定ファイルの詳細の内容などはNginxの公式ドキュメントを参照してください。
ex_django/docker/nginx/conf/app_nginx.conf
にファイルを作成し、以下の内容を記述します。
upstream django {
ip_hash;
# Pythonの公開ポートを設定します。
server python:8001;
}
server {
# Nginxの公開ポートを設定します。
listen 8000;
server_name 127.0.0.1;
charset utf-8;
location /static {
# 静的ファイルのディレクトリのパスを設定します。
alias /static;
}
# 全てのリクエストをdjangoに送るための設定
location / {
uwsgi_pass django;
include /etc/nginx/uwsgi_params;
}
}
# レスポンスヘッダにバージョン番号を出さないための設定(セキュリティのため)
server_tokens off;
次に、ex_django/docker/nginx/uwsgi_params
というファイル名でファイルを作成し、以下の内容を記述します。
(こちらはおまじないのようなものなので、そのままコピペして大丈夫です。それぞれのパラメータがどのようなものか気になる方はこちらのリンクを参照してください。)
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
6. init.sqlの作成
DjangoでのDB作成を許可するため、MySQLの初期設定用のファイルを以下の通り作成します。
ex_django/docker/sql/init.sql
というファイルを作成し、以下の内容を記述します。
GRANT ALL PRIVILEGES ON database.* TO 'user'@'%';
FLUSH PRIVILEGES;
7. Djangoプロジェクト作成
Djangoプロジェクトを作成するため、以下のコマンドを実行します。
$ docker-compose run python django-admin.py startproject app .
8. MySQLとの接続設定
プロジェクトを作成したら、MySQLとの接続の設定を行います。
ex_django/src/app/settings.py
に以下を記述します。
"""
Django settings for app project.
Generated by 'django-admin startproject' using Django 2.0.4.
For more information on this file, see
https://docs.djangoproject.com/en/2.0/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.0/ref/settings/
"""
import os
# ==========ここから追加==========
import pymysql
# connect mysql
pymysql.install_as_MySQLdb()
# ==========ここまで追加==========
.
.
.
さらにex_django/src/app/settings.py
の80行目付近のDATABASESの設定を以下のように設定します。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'database',
'USER': 'user',
'PASSWORD': 'password',
'HOST': 'db',
'PORT': '3306',
}
}
データベースのマイグレーションを行うため、以下のコマンドを実行します。
makemigrations
でモデルに対して行った変更をもとに、新しいマイグレーションを作成します。
migrate
で実際に変更をデータベースに反映しています。
この方法により、データベーススキーマに対するバージョン管理が行えるようになります。
(詳しい説明はDjangoのマイグレーションについてのドキュメントを参照してください。)
$ docker-compose run python ./manage.py makemigrations
$ docker-compose run python ./manage.py migrate
また、合わせて管理者の設定をしておきます。
$ docker-compose run python ./manage.py createsuperuser
上記のコマンドを入力すると以下のような入力を求めらるので任意の値を入力します。
(管理画面にログインするためのユーザー名とパスワードになるので、忘れないように気をつけてください。)
Username (leave blank to use 'root'): (任意のユーザー名を入力します。)
Email address: (メールアドレスを入力します。)
Password: (パスワードを入力します。)
Password (again): (上で設定したパスワードを再入力します。)
9. 動作確認
コンテナを起動するため、以下のコマンドを実行します。
$ docker-compose up -d
Webブラウザでhttp://localhost:8000/にアクセスして、以下のような画面が表示されていれば環境構築は完了です。
これで環境構築は完了です。
サーバを止める場合は、作業ディレクトリで以下のコマンドを実行します。
$ docker-compose stop
Djangoについて詳しく知りたい方はDjangoの公式ドキュメントを参照してください。
このパートでは、Docker Composeを利用したDjangoの開発環境構築を行いました。
お疲れ様でした。