Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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)

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした