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

DockerでDjango環境を作成

More than 1 year has passed since last update.

概要

下記を満たす環境を作成してみます。

  1. DockerでDjangoの実行環境を作成したい。
  2. ソースコード(Django)はホスト(Windows10)に置いてあるファイルを参照したい。開発と確認が楽そうだから・・・
  3. Nginxを用いてDjangoを動かしたい。

前提

ホスト(Windows10)には、Python、Django、Docker for Windowsがインストール済み。

・Python      : 3.6.4
・Django      : 2.0.3
・Docker      : 18.03.1-ce, build 9ee9f40
・docker-compose : 1.21.1, build 7641a569

手順

1. ホスト(Windows10)にDjangoプロジェクト作成

  1. コマンドプロンプトで任意のフォルダに移動。
  2. django-admin startproject gyunyu を実行する。

この段階では下記のような構成になっています。

gyunyu/・・・(1)
    ┣━ manage.py
    ┗━ gyunyu/
        ┣━ __init__.py
        ┣━ settings.py
        ┣━ urls.py
        ┗━ wsgi.py

(1)のフォルダ名は変更可能なので、gyunyu から gyunyu_kanri に変更。

gyunyu_kanri/
 ┣━ mange.py
  ┗━ gyunyu/
     ┣━__init__.py
   ・・・

2. 開発用サーバーの起動と確認

  1. コマンドプロンプトで gyunyu_kanri フォルダ直下に移動。
  2. python manage.py runserver を実行。
  3. ブラウザで http://127.0.0.1:8000/ にアクセスし、Djangoの画面(ロケットが離陸している画面)が表示される事を確認する。

3. アプリケーションの作成

  1. コマンドプロンプトで gyunyu_kanri フォルダ直下に移動。
  2. python manage.py startapp coffee を実行。

この段階で下記のような構成になっています。

gyunyu_kanri/
    ┣━ manage.py
    ┣━ gyunyu/
    ┃   ┣━ __pycache__
    ┃   ┃    ┗・・・
    ┃   ┣━ __init__.py
    ┃   ┣━ settings.py
    ┃   ┣━ urls.py
    ┃   ┗━ wsgi.py
    ┗━ coffee/
        ┣━ migrations
        ┃      ┗━ __init__.py
        ┣━ __init__.py
        ┣━ ・・・
        ┗━ views.py

4. Viewを作成

coffee/views.py
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
    return HttpResponse("Coffee Gyunyu !!!")

5. ViewとURLの紐づけと確認

  1. coffee/urls.py を作成する。
  2. gyunyu/urls.py を修正する。
  3. ブラウザで http://127.0.0.1:8000/coffee/ にアクセスし、4.で作成した画面「Coffee Gyunyu !!!」が表示される事を確認する。
coffee/urls.py
from django.urls import path
from . import views
urlpatterns = [
    path('', views.index)
]
gyunyu/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
    path('admin/', admin.site.urls),
    path('coffee/', include('coffee.urls'))
]

6. DockerでPythonの実行環境作成

下記のような構成になるように、gyunyu_kanri フォルダと同じ階層に python フォルダなどを作成。

/
┣━ gyunyu_kanri/
┃    ┗━ ・・・
┣━ python/
┃    ┣━ work/
┃    ┃   ┣━ requirements.txt
┃    ┃   ┗━ uwsgi.ini
┃    ┗━ Dockerfile
┗━ nginx/
     ┣━ work/
     ┃   ┗━ nginx.conf
     ┗━ Dockerfile
python/Dockerfile
FROM python:3.6
ENV LANG C.UTF-8
ENV TZ Asia/Tokyo
RUN mkdir /home/work
COPY work/ /home/work
WORKDIR /home/work
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
CMD ["uwsgi", "--ini", "/home/work/uwsgi.ini"]
python/work/requirements.txt
django==2.0.3
uwsgi==2.0.17.1
python/work/uwsgi.ini
[uwsgi]
chdir=/home/work/gyunyu_kanri
module=gyunyu.wsgi
master=True
vacuum=True
max-requests=5000
socket=:8000
py-autoreload=1

chdir   : Djangoのプロジェクトを指定。
      Docker Composeで ./gyunyu_kanri:/home/work/gyunyu_kanri をボリュームに設定しています。
module : gyunyu フォルダ直下にある wsgi.py を指定。

7. DockerでNginxのコンテナ作成

下記のような構成になるように、gyunyu_kanri フォルダと同じ階層に nginx フォルダなどを作成。

/
┣━ gyunyu_kanri/
┃    ┗━ ・・・
┣━ python/
┃    ┗━ ・・・
┗━ nginx/
     ┣━ work/
     ┃   ┗━ nginx.conf
     ┗━ Dockerfile
nginx/Dockerfile
FROM nginx:1.13.1-alpine
COPY work/nginx.conf /etc/nginx
RUN apk --no-cache add tzdata && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    apk del tzdata
CMD ["nginx", "-g", "daemon off;"]
nginx/work/nginx.conf
worker_processes auto;
error_log /var/log/nginx/error.log;
events {
    worker_connections 1024;
}
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile            on;
    tcp_nopush          on;
    keepalive_timeout   65;
    types_hash_max_size 2048;
    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    server {
        listen       80 default_server;
        server_name  _;
        root         /home/www/localhost/htdocs;
        location ~ ^/admin|coffee/ {
            include uwsgi_params;
            uwsgi_pass 172.22.0.3:8000;
        }
    }
}

8. docker-compose.ymlを作成

gyunyu_kanri フォルダと同じ階層に docker-compose.yml を作成。

/
┣━ gyunyu_kanri/
┃    ┗━ ・・・
┣━ python/
┃    ┗━ ・・・
┣━ nginx/
┃    ┗━ ・・・
┗━ docker-compose.yml
docker-compose.yml
version: '2'
services:
  gyunyu_kanri-nginx:
    build: "./nginx/"
    ports:
      - "80:80"
    networks:
      gyunyu_kanri-network:
        ipv4_address: 172.22.0.2
  gyunyu_kanri-python:
    build: "./python/"
    volumes:
      - ./gyunyu_kanri:/home/work/gyunyu_kanri
    ports:
      - "8000:8000"
    networks:
      gyunyu_kanri-network:
        ipv4_address: 172.22.0.3
networks:
  gyunyu_kanri-network:
    driver: bridge
    ipam:
     driver: default
     config:
       - subnet: 172.22.0.0/24

9. サービスの起動と確認

※Djangoの開発用サーバが動いている場合は停止させる。

  1. コマンドプロンプトで gyunyu_kanri フォルダ直下に移動。
  2. docker-compose up --build -d を実行。
  3. ブラウザで http://127.0.0.1/coffee/ にアクセスし、4.で作成した画面「Coffee Gyunyu !!!」が表示される事を確認する。

 ・Invalid HTTP_HOST header: 'IPアドレス'. You may need to add 'IPアドレス' to ALLOWED_HOSTS.と表示された場合
   参考:https://www.deep-blog.jp/engineer/archives/4287/

最後に

勤務先の本番環境で運用する場合、オンプレミスな環境にコンテナを生成して運用することになると思います。
その場合、勤務先の業務フローに従うと、コンテナの上げ下げ手順を記載したドキュメントを作成、
その手順に沿ってインフラ担当者に作業を実施して貰う流れになってしまいます。
ソースコードを修正する度にインフラ担当のスケジュールを抑えて、手順書作成してと言う作業が煩わしかったので、
ソースコードはDockerイメージに含めず、ディレクトリをマウントする構成を試してみました。

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