Blank?=False

ゆるゆる仕事したいフリーランスエンジニアの記事

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がないと、上記に書いたように

  1. Pythonイメージでコンテナ作成
  2. コンテナに入って必要な環境構築(フレームワーク DB, ネットワーク)
  3. 環境構築疲れた。だるい。

ってのを毎回やるはめになります。

コレが、環境構築のコードファイルを一回作ってしまえば、似たような仕組みのプロジェクトでまた環境を作る、 他のプロジェクトメンバーに環境配布をすることが非常に楽になります。

プロジェクトメンバーで環境がバラバラだと・・・めんどくさいです。

今回作りたかった環境

今回、下記のような環境を作りたかったのです。

PostgreSqlはコマンドを覚えてないのでMySQLMariaDBばっかり使ってる

使うイメージ

イメージは基本的に全部DockerHubからPullします。

Django

PythonOfficial 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を作りBuildDjangoのコンテナを作ります。

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

Debian/Ubuntu

$ sudo apt-get install python3-dev default-libmysqlclient-dev build-essential

Redhat /CentOS

% sudo yum install python3-devel mysql-devel

今回の環境では、上記のパッケージのインストールは不要でしたが、[mariadb-client]のインストールが必要でした。

docker-composeの作成

上記のDokcerFileを保存したフォルダと同じフォルダにdocker-compose.ymlファイルを作成し、内容を下記のようにします。

Django+MariaDB(adminer) 環境構築

サブネットを指定し、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を始める方にはオススメです!

knowledge.sakura.ad.jp