Docker-ComposeでPython3.6+NGINX+MariaDB10+uWSGIのDjango環境欲張りセット


Docker-composeで使えるDjango環境

色々見て周りながら環境構築したんだけど、記事が古かったりとかで数時間かかったので。


  • nginx

  • mariadb10

  • python3.6

  • uWSGI

uWSGIはオートリロードもちゃんと対応するよ。

むしろそれがやりたくて時間かかってた感じ。

解説少なめ

参考ページはいっぱいっ。


Dockerfile作りましょ


./web/Dockerfile

FROM python:3.6

ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install mysqlclient
RUN pip install -r requirements.txt
ADD . /code/

Python3はこっから導入。コンテナ内でのアプリケーションディレクトリは/code


必要なものリスト作る


./web/requirements.txt

Django

uwsgi
PyMySQL

バージョン指定してないけど、ほんとはしたほうが良きだと思う。


docker-compose.yml 作りましょ


./docker-compose.yml

version: '3.4'

volumes:
django.db.volume:
name: django.db.volume

services:
nginx:
image: nginx:1.13
container_name: django.nginx
ports:
- "8000:8000"
volumes:
- ./nginx/conf:/etc/nginx/conf.d
- ./nginx/uwsgi_params:/etc/nginx/uwsgi_params
- ./static:/static
- ./nginx/log:/var/log/nginx
depends_on:
- web

db:
image: mariadb:10
container_name: django.db
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: password
TZ: 'Asia/Tokyo'
volumes:
- django.db.volume:/var/lib/mysql
- ./sql:/docker-entrypoint-initdb.d

web:
build: ./web
container_name: django.web
command: uwsgi --ini /code/sugoi_site/django.ini
volumes:
- ./src:/code
- ./static:/static
expose:
- "8001"
depends_on:
- db


NGINXとMariaDBの初期設定は読み込むファイル作る。

NGINXはログ出力も対応しておく。


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
}
}


uWSGIのための設定くらい。


uWSGIの為のNGINX連携設定ファイルつくるよ


./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;


これが俗にいう、おまじないってやつ。

脳死でコピペ。


SQLの初期設定ファイルつくるよ


./sql/init.sql

CREATE DATABASE IF NOT EXISTS sugoi_site CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

CREATE USER IF NOT EXISTS 'sugoi_site'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON sugoi_site.* TO 'sugoi_site'@'%';

FLUSH PRIVILEGES;


データベース作ってユーザーつくっとくやつ。

ローカル開発環境用だからガバガバなんだよ?


必要なディレクトリ作っとくよ

mkdir でも右クリックから新規フォルダでもお好きに作る。

./src ここにdJangoプロジェクトが入る

./static 静的なファイル入るとこ


DjangoProjectを作る


./

docker-compose run web django-admin.py startproject sugoi_site .


プロジェクトが出来上がったらuWSGIの為に設定ファイルつくる


uWSGIのiniをDjangoプロジェクトディレクトリに配置


./src/sugoi_site/django.ini

[uwsgi]

socket = :8001
module = sugoi_site.wsgi
wsgi-file = /code/sugoi_site/wsgi.py
logto = /code/sugoi_site/uwsgi.log
py-autoreload = 1

logtoでログ出力も対応しておく。

py-autoreloadは開発環境でなら使ってもいいオートリロード機能

1秒経過後にリクエストがあったらリロードしてくれる。

秒数は変更可。

docker-compose.yml内、webのcommand



command: uwsgi --ini /code/sugoi_site/django.ini



に対応。


Djangoの設定


./src/sugoi_site/settings.py

DATABASES = {

'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'sugoi_site',
'USER': 'root',
'PASSWORD': 'password',
'HOST': 'db',
'PORT': '3306',
'OPTIONS': {
'charset': 'utf8mb4',
},
}
}

ユーザー作ったのに面倒くさいからrootでアクセスしてるけど気にしない。


./src/sugoi_site/settings.py

STATIC_ROOT = '/static'

STATIC_URL = '/static/'

これ追加すると、静的ファイルが読み込まれるようになるよ。


マイグレーション


./

docker-compose run web ./manage.py makemigrations

docker-compose run web ./manage.py migrate

成功すれば、データベースアクセスはバッチリ!


uWSGIに設定ファイル読み込ませるためにもう一回起動


./

docker-compose down

docker-compose up -d

一応ダウンしてからアップ


./

docker-compose ps


db , web , nginx が up になっていればOK


127.0.0.1:8000にアクセス

Djangoインストール完了画面が出ていれば成功です。

uWSGIのログ見ましょ。


./src/sugoi_site/uwsgi.log

Python auto-reloader enabled

[pid: 6|app: 0|req: 1/1] 172.19.0.1 () {44 vars in 859 bytes} [Sat Sep 1 13:46:52 2018] GET / => generated 12 bytes in 34 msecs (HTTP/1.1 200) 3 headers in 108 bytes (1 switches on core 0)

何回かブラウザでF5押して、こんな感じの行が増えていけばオートリロードされてるよ。

ソースは全部コピペして使ってもらえれば今の所動くはず(2018/09/01)


参考

DockerでDjangoの開発環境を作成する(Quickstart: Compose and DjangoのMySQL版)

Docker-Composeで作るDjango開発環境(Django + MySQL + uWSGI + Nginx)