DockerでDjango+MariaDB開発環境を構築
最近、MacをやめてWindowsマシンで開発をするようになりました。
8年ぐらい前はWeb開発といえば、Mac(Bashがあるから)という印象でしたが、 今はDockerでコンテナを作ってVSCodeでAttach, Linux上でコードをサクサク書いていけるので便利になりました!
ただ、今までDocker-Composeを触っていなかったので、
Pythonイメージからコンテナを作って、exec
コマンドでコンテナに入ってpip install django
等で環境構築していたので、
Docker-Composeを使ってより楽に構築してしまおう!とComposeを触ってみることにしました。
そもそもDocker-Composeって何?
Docker上で動くIaac(Infrastructure as code)の一種です。 必要な構成をコード(docker-compose.yml)にしておくことで、同じような環境を何個も作りたいときに効果を発揮します。
Iaacがないと、上記に書いたように
ってのを毎回やるはめになります。
コレが、環境構築のコードファイルを一回作ってしまえば、似たような仕組みのプロジェクトでまた環境を作る、 他のプロジェクトメンバーに環境配布をすることが非常に楽になります。
プロジェクトメンバーで環境がバラバラだと・・・めんどくさいです。
今回作りたかった環境
今回、下記のような環境を作りたかったのです。
※PostgreSqlはコマンドを覚えてないのでMySQLかMariaDBばっかり使ってる
使うイメージ
イメージは基本的に全部DockerHubからPullします。
Django
PythonのOfficial ImageにDjangoをインストールして使います。 hub.docker.com
DockerHubのOfficial ImageにDjangoもあるんですが、古いバージョンしかありませんのでPythonイメージに入れるのがよし。
MariaDB
Official イメージを使います。 ※何も考えずにDocker Runしたらエラーになるので注意。ROOT PASSWORDの設定が必要です。 hub.docker.com
adminer
(あまり使わないけど)DB管理できるので開発用に入れときます。 hub.docker.com
これらのコンテナを同じネットワーク上で動くように構築します。
DockerFileを作成
Pythonイメージからコンテナを作っただけでは、Djangoが入ってません。
Django入りのコンテナを自動構築するために, DockerFileを作りBuild
でDjangoのコンテナを作ります。
DockerFile作成
プロジェクトのフォルダを作り、DockerFileを下記の内容で作成します。
FROM python:3.8 RUN mkdir /app WORKDIR /app RUN apt update RUN apt install -y mariadb-client ADD requirements.txt /app/ RUN pip install -r requirements.txt ADD . /app/
最新のPythonは3.10.xですが、AWS lambda等ではまだ3.8までしか使えないので(記事執筆時点)、 3.8を使います。 また、mysqlclientで必要となるmariadb-clientをインストールします。
requrements.txt作成
Dockerfileと同じフォルダにrequirements.txtを作り、内容を下記のようにします。
django==3.2.6 mysqlclient
djangoの他に、MariaDB接続用にMySQLClientを入れています。
これでDokcerFileは完成です。
mysqlclientに必要なパッケージについて
mysqlclientのreadmeでは、下記のようにパッケージのインストールが指示されています。 pypi.org
$ sudo apt-get install python3-dev default-libmysqlclient-dev build-essential
% sudo yum install python3-devel mysql-devel
今回の環境では、上記のパッケージのインストールは不要でしたが、[mariadb-client]のインストールが必要でした。
docker-composeの作成
上記のDokcerFileを保存したフォルダと同じフォルダにdocker-compose.ymlファイルを作成し、内容を下記のようにします。
サブネットを指定し、ipv4アドレスをそれぞれ下記のように割り当てます。
- db 172.100.0.2
- adminer 172.100.0.3
- app 172.100.0.5
上記が準備できたら、下記コマンドでコンテナを作成します。
$docker-compose up -d Creating network "django-mariadb_app-network" with the default driver Building app <省略> Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them WARNING: Image for service app was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. Creating django-mariadb_db_1 ... done Creating django-mariadb_adminer_1 ... done Creating django-mariadb_app_1 ... done
無事3つのコンテナが立ち上がりました。
DBのセットアップ
DB接続確認
django-mariadb_app_1コンテナに入り、DBの接続を確認します。 (直接DBのコンテナに入らずアプリケーションコンテナからアクセスできるかを確認)
$docker exec -it django-mariadb_app_1 bash $-u root -p --host=172.100.0.2 Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 6 Server version: 10.6.4-MariaDB-1:10.6.4+maria~focal mariadb.org binary distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>
このあとの接続確認ように、HeloWorldデータベースを作っておきます。
MariaDB [(none)]> CREATE DATABASE HelloWorld;
DjangoからのDB接続確認
bashのmysqlClientから接続が確認できたら、Djangoをセットアップして DjangoからのDB接続確認をします。
サクッとDjango環境を作ります。
$django-admin startproject helloworld .
setting.pyのDatabaseを下記のように編集します。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': '172.100.0.2', 'NAME': 'HelloWorld', 'USER': 'root', 'PASSWORD':'password' } }
setting.pyの編集が終わったら、下記コマンドで接続できることを確認します。
$python manage.py dbshell Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 7 Server version: 10.6.4-MariaDB-1:10.6.4+maria~focal mariadb.org binary distribution Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [HelloWorld]>
問題なくできれば、これで設定は完了です。
あとがき
docker-composeになれるために実際に上記の環境を作ってみましたが、 一度設定ファイルを作ってしまえば環境をすぐに構築できるようになるので、すごく楽になると思いました。
dbはコンテナを作ったらそのままなので、これもdockfileを作ってデータベースを作ってしまえば、更に改善できると思います。
参考文献
本記事は下記のさくらインターネットの記事を参考にしました。 わかりやすいので、Dockerを始める方にはオススメです!