Django
nginx
mariadb
docker
python3.6

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)