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

# Docker-composeで使えるDjango環境

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

- nginx
- mariadb10
- python3.6
- uWSGI

uWSGIはオートリロードもちゃんと対応するよ。
むしろそれがやりたくて時間かかってた感じ。

**解説少なめ**

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

# Dockerfile作りましょ

```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**

## 必要なものリスト作る

```pip-requirements:./web/requirements.txt
Django
uwsgi
PyMySQL
```

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

# docker-compose.yml 作りましょ

```yaml:./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の設定ファイルつくるよ

```conf:./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連携設定ファイルつくるよ

```txt:./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:./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を作る

```bash:./
docker-compose run web django-admin.py startproject sugoi_site .
```
プロジェクトが出来上がったらuWSGIの為に設定ファイルつくる

#uWSGIのiniをDjangoプロジェクトディレクトリに配置
```ini:./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の設定

```py:./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でアクセスしてるけど気にしない。

```py:./src/sugoi_site/settings.py
STATIC_ROOT = '/static'
STATIC_URL = '/static/'
```

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

#マイグレーション
```bash:./
docker-compose run web ./manage.py makemigrations
docker-compose run web ./manage.py migrate
```
成功すれば、データベースアクセスはバッチリ！

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

```bash:./
docker-compose down
docker-compose up -d 
```
一応ダウンしてからアップ

```bash:./
docker-compose ps
```

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

#127.0.0.1:8000にアクセス

Djangoインストール完了画面が出ていれば成功です。
uWSGIのログ見ましょ。

```log:./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版）](https://aoishi.hateblo.jp/entry/2017/11/05/153341)
[Docker-Composeで作るDjango開発環境(Django + MySQL + uWSGI + Nginx)](https://nmmmk.hatenablog.com/entry/2018/05/01/101126)