Docker-Composeで作るDjango開発環境(Django + MySQL + uWSGI + Nginx)
Django(Django + Postgre)の開発環境は、下記のQuickstartに記載されている通りに進めれば、構築することができます。
今回は、これを応用して、Django + MySQL + uWSGI + Nginxで環境構築します。
環境
項目 | Version |
---|---|
Docker | 18.03.1-ce, build 9ee9f40 |
Docker-Compose | 1.21.1, build 5a3f1a3 |
Python | 3.6 |
Django | 2.04 |
MySQL | 5.7 |
Nginx | 1.13 |
PyMySQL | 0.8.0 |
uWSGI | 2.0.17 |
プロジェクトフォルダ構成
docker-compose.yml
docker-compose.ymlの全体の定義は以下の様になります。
Django環境設定
Dockerfile
コンテナ生成のための設定を行います。
FROM python:3.6 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code ADD requirements.txt /code/ RUN pip install -r requirements.txt ADD . /code/
requirements.txt
インストールが必要なモジュールの定義を行います。
Django==2.04 uwsgi==2.0.17 PyMySQL==0.8.0
docker-composeの設定
下記のcommand部分はコンテナ起動時に実行するコマンドとなりますが、./manage.py runserver
ではないことに注意してください。
また、今回は8001番ポートで待ち受けを行います。
web: build: ./web container_name: mysite.web command: uwsgi --socket :8001 --module mysite.wsgi volumes: - ./src:/code - ./static:/static expose: - "8001" depends_on: - db
MySQL環境設定
docker-composeの設定
DBデータの永続化を行います。
volumes: mysite.db.volume: name: mysite.db.volume
MySQLコンテナの設定を行います。
db: image: mysql:5.7 container_name: mysite.db ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: mysitepass TZ: 'Asia/Tokyo' volumes: - mysite.db.volume:/var/lib/mysql - ./sql:/docker-entrypoint-initdb.d
DB初期化SQL
DB初期化用SQLを作成し、DBの作成やユーザー・パスワードを設定します。
ここでは、以下の様な設定としています。
項目 | 値 |
---|---|
DB名 | mysite |
ユーザー | mysiteuser |
パスワード | mysitepass |
CREATE DATABASE IF NOT EXISTS mysite CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER IF NOT EXISTS 'mysiteuser'@'%' IDENTIFIED BY 'mysitepass'; GRANT ALL PRIVILEGES ON mysite.* TO 'mysiteuser'@'%'; FLUSH PRIVILEGES;
uWSGI環境設定
設定ファイル作成
NginxのuWSGIモジュール用の設定ファイルをに作成します。
[./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;
Nginx環境設定
docker-compose設定
nginx: image: nginx:1.13 container_name: mysite.nginx ports: - "8000:8000" volumes: - ./nginx/conf:/etc/nginx/conf.d - ./nginx/uwsgi_params:/etc/nginx/uwsgi_params - ./static:/static depends_on: - web
設定ファイル作成
Nginxの設定ファイルを作成します。
[./nginx/conf/mysite_nginx.conf]
# the upstream component nginx needs to connect to upstream django { ip_hash; server web:8001; } # configuration of the server server { # the port your site will be served on listen 8000; # the domain name it will serve for server_name 127.0.0.1; # substitute your machine's IP address or FQDN charset utf-8; # max upload size client_max_body_size 75M; # adjust to taste location /static { alias /static; } # Finally, send all non-media requests to the Django server. location / { uwsgi_pass django; include /etc/nginx/uwsgi_params; # the uwsgi_params file you installed } }
Djangoのプロジェクト生成
以下のコマンドを実行して、Djangoのプロジェクトを生成します。
$ docker-compose run web django-admin.py startproject mysite .
DjangoソースコードのMySQL対応
settings.pyの編集
MySQLと接続するための記述を追加します。
import pymysql
pymysql.install_as_MySQLdb()
DATABASESの内容を以下の様に変更します。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mysite', 'USER': 'mysiteuser', 'PASSWORD': 'mysitepass', 'HOST': 'db', 'PORT': '3306', 'OPTIONS': { 'charset': 'utf8mb4', }, } }
DBマイグレーション
以下のコマンドを実行して、DBマイグレーションを実行します。
$ docker-compose run web ./manage.py makemigrations $ docker-compose run web ./manage.py migrate
管理者の設定
以下のコマンドを実行して、管理者の設定を行います。
$ docker-compose run web ./manage.py createsuperuser
コンテナを起動する
以下のコマンドを実行して、コンテナを起動します。
$ docker-compose up -d
ブラウザで動作確認!
rootにアクセスする
http://localhost:8000 にアクセスし、以下の様な画面が表示されればOK。
管理者サイトにアクセスする
http://localhost:8000/admin にアクセスすると、以下の様な画面表示となり、CSSが適用されていないことがわかります。
CSS適用
まずは、settings.pyに以下の記述を追加してください。
STATIC_ROOT = '/static'
次に以下のコマンドを実行してください。
$ docker-compose run web ./manage.py collectstatic
再度、http://localhost:8000/adminにアクセスして、以下の様な画面が表示されればOKです。