Docker-composeで使えるDjango環境
色々見て周りながら環境構築したんだけど、記事が古かったりとかで数時間かかったので。
- nginx
- mariadb10
- python3.6
- uWSGI
uWSGIはオートリロードもちゃんと対応するよ。
むしろそれがやりたくて時間かかってた感じ。
解説少なめ
参考ページはいっぱいっ。
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**
必要なものリスト作る
Django
uwsgi
PyMySQL
バージョン指定してないけど、ほんとはしたほうが良きだと思う。
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の設定ファイルつくるよ
# 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連携設定ファイルつくるよ
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の初期設定ファイルつくるよ
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プロジェクトディレクトリに配置
[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の設定
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'sugoi_site',
'USER': 'root',
'PASSWORD': 'password',
'HOST': 'db',
'PORT': '3306',
'OPTIONS': {
'charset': 'utf8mb4',
},
}
}
ユーザー作ったのに面倒くさいからrootでアクセスしてるけど気にしない。
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のログ見ましょ。
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)