moto blog

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

f:id:nmmmk:20180503173757j:plain

Django(Django + Postgre)の開発環境は、下記のQuickstartに記載されている通りに進めれば、構築することができます。

今回は、これを応用して、Django + MySQL + uWSGI + Nginxで環境構築します。

docs.docker.com

環境

項目 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

プロジェクトフォルダ構成

f:id:nmmmk:20180910161302p:plain

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

[./sql/init.sql]

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。
f:id:nmmmk:20180501092926p:plain

管理者サイトにアクセスする

http://localhost:8000/admin にアクセスすると、以下の様な画面表示となり、CSSが適用されていないことがわかります。

f:id:nmmmk:20180501093255p:plain

CSS適用

まずは、settings.pyに以下の記述を追加してください。

STATIC_ROOT = '/static'

次に以下のコマンドを実行してください。

$ docker-compose run web ./manage.py collectstatic

再度、http://localhost:8000/adminにアクセスして、以下の様な画面が表示されればOKです。

f:id:nmmmk:20180501093902p:plain

その他

ソースコードGitHubに置いています。

github.com