docker-composeでDjango+MySQLの環境を構築する

背景

前回の記事で使用するプログラミング言語としてPythonが選ばれやすいというお話をしました。

Pythonで利用できるWebフレームワークとして、二つの候補があります。flaskDjangoです。

軽量なフレームワークが良いか、フルスタックのフレームワークが良いか、という議論はあると思いますが、わたしはRailsに慣れているということ、また、10年くらい前にDjangoを利用していたこともあって、Djangoを採用したいと思います。

まずはローカル開発環境を整えようと思い、docker composeを利用してローカル開発環境を構築するところから始めようと思います。

docker composeを利用した例

Django docker composeと検索すると、クィックスタート: Compose と Djangoというページがヒットします。

これはありがたいと思って見てみると、データベースがpostgreSQLという点以外は探していた情報とマッチします。この情報を元にデータベースをpostgreSQLからMySQLに変更してみようと思います。

MySQLコンテナの設定

先ほどのページに載っていたdocker-compose.ymlは以下のようになっていました

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

dbをMySQLに変更してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
version: '3'

services:
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: 'django'
MYSQL_PASSWORD: 'django'
MYSQL_DATABASE: 'django'
ports:
- 3306:3306
volumes:
- mysql:/var/lib/mysql
web:
build: .
command: python3 manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "8000:8000"
links:
- db

volumes:
mysql:
driver: local

MySQLコンテナの設定についてはdockerhubのサイトをご確認ください。

ここではdjangoユーザーを作成し、パスワードをdjangoに設定、djangoというデータベースを作成しました。

次にDjango側のデータベース接続設定を行います。

Djangoのデータベース接続設定

Djangoのデータベース接続設定を探します。今回はひながた生成の手順に沿って行っていきます。

プロジェクトの作成

以下のコマンドで作成します

1
docker-compose run web django-admin.py startproject composeexample .

composeexampleが作成できました。

データベース設定ファイルの確認

データベース設定ファイルはcomposeexample/settings.pyに記載されていました。

1
2
3
4
5
6
7
8
9
10
11
12
# Database
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'postgres',
'USER': 'postgres',
'HOST': 'db',
'PORT': 5432,
}
}

postgreSQLの設定になっているので、MySQLの設定に修正します。

1
2
3
4
5
6
7
8
9
10
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django',
'USER': 'django',
'PASSWORD': 'django',
'HOST': 'db',
'PORT': 3306,
}
}

先ほどMySQLコンテナに設定した内容をsettings.pyに反映しました。

起動確認

docker-compose upで起動してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ docker-compose up
Starting django_db_1 ... done
Starting django_web_1 ... done
Attaching to django_db_1, django_web_1
(中略)
web_1 | Watching for file changes with StatReloader
web_1 | Performing system checks...
web_1 |
web_1 | System check identified no issues (0 silenced).
web_1 |
web_1 | You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
web_1 | Run 'python manage.py migrate' to apply them.
web_1 | June 24, 2021 - 12:27:25
web_1 | Django version 3.2.4, using settings 'composeexample.settings'
web_1 | Starting development server at http://0.0.0.0:8000/
web_1 | Quit the server with CONTROL-C.

http://localhost:8000にアクセスします。

ローカル開発環境でのtopページ

無事確認できました。

まとめ

Django+MySQLのローカル開発環境をdocker composeで作成することができました。

Macで実行しているので、docker-syncを用いてローカルのソースコードの同期をスムーズに行ってみようと思います。

おまけ

Django起動時のメッセージをよく読むと

1
2
web_1  | You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
web_1 | Run 'python manage.py migrate' to apply them.

とありましたので、マイグレーションしてみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ docker-compose run --rm web python manage.py migrate
Starting django_db_1 ... done
Creating django_web_run ... done
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK

マイグレーションが完了しました。

docker-compose upしたときのメッセージも確認します

1
2
3
4
5
6
7
8
web_1  | Watching for file changes with StatReloader
web_1 | Performing system checks...
web_1 |
web_1 | System check identified no issues (0 silenced).
web_1 | June 24, 2021 - 12:59:28
web_1 | Django version 3.2.4, using settings 'composeexample.settings'
web_1 | Starting development server at http://0.0.0.0:8000/
web_1 | Quit the server with CONTROL-C.

マイグレーションしてねのメッセージも消えていますね。

参考図書

まもなくDjangoの3.2LTS対応の本が発売されます!出たらすぐ買って読もうと思います!