
目次
こんにちは。sinyです。
最近Docker入門したばかりですが、知識定着のためDocker関連の記事をアウトプットしていきます。
本記事では、Windows環境+DockerでDjangoアプリを構築する手順のまとめ記事です。
前提環境
本記事では、以下の環境を前提にしています。
| 項目 | バージョン等 |
| OS | Windows10(Home) |
| DB | Postgress |
| Django | 2.x |
| Docker | DockerToolbox |
DockerToolboxのインストール
まず最初にDockerToolboxをインストールします。
上記リンク先から「DockerToolbox-19.03.1.exe」をダウンロードしたらexeファイルをダブルクリックしてインストールします。
インストール自体は画面の指示に従うだけで簡単にできます。
インストールが完了すると、デスクトップに「Docker Quickstart Terminal」というアイコンが生成されるので、クリックするとDocker環境のターミナル画面が起動します。

Error creating machine: Error in driver during machine creation: This computer doesn't have VT-X/AMD-v enabled. Enabling it in the BIOS is mandatory
Djangoコンテナ作成に必要なファイルの準備
Djangoのコンテナ環境構築に必要な3つのファイルを設定指定します。
Dockerfileの作成
任意のフォルダで以下を記述したDockerfileを作成します。
今回はC:\Users\django_dockerとします。
FROM python:3.6 ENV PYTHONUNBUFFERED 1 RUN mkdir /code WORKDIR /code ADD requirements.txt /code/ RUN pip install -r requirements.txt
設定ファイルの意味は以下の通りです。
- FROM python:3.6 → Dockerイメージのベースとなるイメージを指定(Docker hubで公開されているイメージ名を指定します)
- ENV PYTHONUNBUFFERED 1→バッファが溜まってから出力するのを避けるための記述。
- RUN mkdir /code → /codeフォルダを作成
- WORKDIR /code → ワークディレクトリを設定
- ADD requirements.txt /code/ → requirements.txtをワークディレクトリ(/codeにコピーする)
- RUN pip install -r requirements.txt → pip install で必要なモジュールをインストール
docker-compose.ymlの作成
つづいて、Dockerfileと同じディレクトリにdocker-compose.ymlという名称でファイルを作り以下の設定を記述します。
version: '3'
services:
db:
image: postgres
web:
build: .
command: python3 manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
- version: '3' →docker-compose.ymlのファイルフォーマットバージョンを宣言(バージョン3は最新版)
- services: →サービスの要素を定義
- db: →コンテナの名前の定義(データベース)
- image: postgres →利用するDockerイメージ名を指定(今回はpostgres)
- web: →コンテナの名前の定義(ウェブサーバ)
- build: . → カレントディレクトリを指定してDockerイメージのビルドを実行
- command: python3 manage.py runserver 0.0.0.0:8000 → コマンドの実行(Django開発サーバの実行)
- volumes:
- .:/code →カレントディレクトリをコンテナ内のワークディレクトリにマウント - ports:
- "8000:8000" →ポートフォワーディング設定(外から80ポートにアクセスしてコンテナ内の80ポートに連携)depends_on: → コンテナの依存関係を定義する(webサーバはdbコンテナに依存する関係を定義)
- db
requirements.txtの作成
続いて、インストールpythonモジュールの定義をrequirements.txtに記載します。
今回は、djangoとpostgresの連携に必要なpsycopg2をインストールします。
Django>=2.1,<2.2 psycopg2
Dockerコンテナの作成と起動
dockerのターミナル画面でC:\Users\django_dockerに移動してから以下のコマンドを実行します。
cd /c/Users/django_docker docker-compose run --rm web django-admin.py startproject example .
docker-compose runコマンドを使ってコンテナを作成&実行します。
これでDjangoのプロジェクトが生成されます。(プロジェクト名がexample)
![]()
コマンドが正常終了すると、以下の通りdjango-dockerフォルダ直下にexampleフォルダ(Djangoプロジェクト)が生成されます。
また、manage.pyも同じフォルダ内に生成されます。

Django初期設定
example\settings.pyを開いて以下の点を変更します。
1点目は、ALLOWED_HOSTS = ["*"]です。
2点目はpostgres用のdb接続設定を以下の通り設定します。
ALLOWED_HOSTS = ["*"]
DATABASES = {
'default': { 'ENGINE': 'django.db.backends.postgresql',
'NAME':
'postgres',
'USER':
'postgres',
'HOST':
'db',
'PORT': 5432,
}
}
以下のコマンドを実行して変更内容をコンテナに反映させます。
docker-compose up -d
以下の表なメッセージが表示されればOKです。

http://192.168.99.100:8000/にアクセスして以下のようなDjango画面が表示されればOKです。

Djangoアプリの作成
続いて以下のコマンドを実行してDjangoのアプリケーションを作成します。
今回は家計簿アプリを作るのでアプリケーション名をkakeiboにしています。
docker-compose run --rm web python manage.py startapp kakeibo
コマンドが正常終了すると、以下の通りdjangoのアプリケーションフォルダ(kakeibo)が生成されます。

kakeiboフォルダの中身は以下の通り通常のDjangoで作ったときのアプリケーションのモジュールが生成されます。

Djangoモデルの作成
続いてkakeibo\models.pyに家計簿テーブルを定義します。
設定は以下の通りCategoryとKakeiboテーブルを定義します。
from django.db import models
from datetime import datetime
class Category(models.Model):
class Meta:
#カテゴリ
verbose_name ="カテゴリ"
verbose_name_plural ="カテゴリ"
#カラム名の定義
category_name = models.CharField(max_length=255,unique=True)
def __str__(self):
return self.category_name
class Kakeibo(models.Model):
class Meta:
verbose_name ="家計簿"
verbose_name_plural ="家計簿"
#カラムの定義
date = models.DateField("日付",default=datetime.now)
category = models.ForeignKey(Category, on_delete = models.PROTECT, verbose_name="カテゴリ")
money = models.IntegerField("金額", help_text="単位は日本円")
quantity = models.IntegerField(verbose_name="数量",default=0)
memo = models.CharField(verbose_name="メモ", max_length=500)
def __str__(self):
return self.memo
次に、settings.pyに先ほど作成したアプリケーションを追加しておきます。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'kakeibo',#add
]
マイグレーションの実行
続いて、定義したモデルの内容をデータベースへ反映させるためにマイグレーションを実行します。
docker-compose run --rm web python manage.py makemigrations kakeibo
以下のようにエラーが表示されなければOKです。

続いて以下のコマンドでmigrateを実行してdbに反映させます。
docker-compose run --rm web python manage.py migrate
以下のようにエラーなしで正常終了すればOKです。

管理ユーザの作成
続いて、Djangoの管理サイトのアクセスするために管理者ユーザを作成しておきます。
コマンドは以下の通りです。
docker-compose run --rm web python manage.py createsuperuser

admin.pyの設定
管理画面上にCategoryとKakeiboテーブルが表示されるようにkakeibo\admin.pyの設定を以下の通り変更します。
from django.contrib import admin
from .models import Category, Kakeibo
class KakeiboAdmin(admin.ModelAdmin):
list_display=('pk','date','category','money','quantity','memo')
class CategoryAdmin(admin.ModelAdmin):
list_display=('pk','category_name')
admin.site.register(Category, CategoryAdmin)
admin.site.register(Kakeibo,KakeiboAdmin)
以下のコマンドを実行して変更を反映させます。
docker-compose up -d
http://192.168.99.100:8000/adminにアクセスして先ほど作成した管理者ユーザでログオンします。
以下のとおりKakeiboとCategoryテーブルが表示されればOKです。

以下のような感じでいくつかカテゴリと家計簿テーブルにデータを登録しておきましょう。

追加モジュールのインストール手順
ここで、以下の追加モジュールをインストールします。
django-bootstrap-form
django-extensions
後からコンテナに対してモジュールをインストールしたい場合はdocker container exec コマンドを使います。
docker container exec -it django_docker_web_1 pip install django-bootstrap-form docker container exec -it django_docker_web_1 pip install django-extensions
以下の通りインストールが正常終了すればOKです。

なお、-itの次に指定している「django_docker_web_1」はdocker psコマンドで以下の通り確認できます。

新しく追加した2つのモジュールをsettings.pyに追加しておきましょう。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'kakeibo',
'bootstrapform', #add
'django_extensions', #add
]
構文エラーチェックの方法
ちなみに、djangoプロジェクトのエラーは以下のコマンドで確認できます。
docker container exec -it <コンテナID> python manage.py check
エラーがなければ以下のように表示されます。

家計簿一覧画面設定
最後に、家計簿一覧画面を定義するためにviews.py、urls.py,templatesを作成していきます。
まずはkakeibo\views.pyに以下の定義を設定します。
from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic import ListView
from .models import Category, Kakeibo
#一覧表示用のDjango標準ビュー(ListView)を承継して一覧表示用のクラスを定義
class KakeiboListView(ListView):
#利用するモデルを指定
model = Kakeibo
#データを渡すテンプレートファイルを指定
template_name = 'kakeibo/kakeibo_list.html'
#家計簿テーブルの全データを取得するメソッドを定義
def queryset(self):
return Kakeibo.objects.all()
続いてプロジェクト直下のexample\urls.pyを以下の設定にします。
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('kakeibo/',include('kakeibo.urls')),
]
次はアプリケーション配下のkakeibo\urls.pyを新規に作成し以下の通り設定します。
from django.urls import path
from . import views
urlpatterns = [
path('kakeibo_list/', views.KakeiboListView.as_view(), name='kakeibo_list'),
]
最後にテンプレートファイルを作成します。
テンプレートはkakeibo\templates\kakeiboフォルダを作成し、base.htmlとkakeibo_list.htmlを以下の通り作成します。
base.html
<!doctype html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
{# Bootstrap4を使う #}
<!-- linkタグでbootstrapのcssファイルを読み込む -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css">
<!-- linkタグでDataTableのcssファイルを読み込む -->
<link rel="stylesheet" href="https://cdn.datatables.net/t/bs-3.3.6/jqc-1.12.0,dt-1.10.11/datatables.min.css"/>
<!-- タイトルの設定-->
<title>Tutorial</title>
<body>
{% block content %}
<!-- block content ~ endblockの間に子テンプレートの内容が差し込まれる -->
{% endblock %}
<!-- bootstrapのjavascrit読み込み-->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js"></script>
<!-- DataTablesのjavascrit読み込み-->
<script src="https://cdn.datatables.net/t/bs-3.3.6/jqc-1.12.0,dt-1.10.11/datatables.min.js"></script>
<!-- chart.jsの読み込み -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.min.js"></script>
<script type="text/javascript" charset="utf8" src="//cdn.datatables.net/plug-ins/1.10.6/sorting/currency.js"></script>
<!-- Databableの定義-->
<script>
jQuery(function($){
// デフォルトの設定を変更
$.extend( $.fn.dataTable.defaults, {
language: {
url: "http://cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/Japanese.json"
}
});
$("#kakeibo_list").DataTable({
"searching": true, //検索機能
"paging": true, //ページング機能
"ordering": true, //ソート機能
"lengthChange": true, //件数切り替え機能
}).columns.adjust().draw();
});
</script>
</body>
</html>
kakeibo_list.html
<!-- 親テンプレートを読み込む-->
{% extends './base.html' %}
{% block content %}
<div class="content-wrapper">
<div class="container-fluid">
<!-- パンくずリストの設定-->
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="{% url 'kakeibo_list' %}">TOP</a>
</li>
<li class="breadcrumb-item active">一覧表示</li>
</ol>
<!--ページタイトル-->
<div class="card mb-3">
<div class="card-header">
<h3><b>家計簿アプリ</b></h3></div>
<div class="card-body">
<!-- テーブル表の定義 -->
<table id=kakeibo_list width="100%" class="table table-striped table-bordered table-hover">
<!-- 表の列の定義-->
<thead>
<tr>
<th class="text-center">日付</th>
<th class="text-center">カテゴリ</th>
<th class="text-center">金額</th>
<th class="text-center">数量</th>
<th class="text-center">メモ</th>
</tr>
</thead>
<!-- ここまでが表の列の定義-->
<!-- 表のデータ部分の表示-->
<tbody>
{% for item in object_list %}
<tr class="odd gradeX text-center">
<td class="text-center" width="100">{{ item.date}}</td>
<td class="text-center" width="100">{{ item.category }}</td>
<td class="text-center" width="140">{{ item.money}}円</td>
<td class="text-center" width="140">{{ item.quantity}}</td>
<td class="text-center" width="140">{{ item.memo }}</td>
</td>
</tr>
{% endfor %}
</tbody>
<!-- ここまでが表のデータ部分の表示-->
</table>
<!-- ここまでがテーブル表の定義 -->
</div>
</div>
</div>
</div>
{% endblock content %}
http://192.168.99.100:8000/kakeibo/kakeibo_list/にアクセスして以下の通り家計簿一覧画面が表示されればOKです。

以上、Windows+DjangoでDocker入門【入門者向け】でした。
