やりたかったこと
docker-composeでdjangoコンテナとmariadbコンテナを構築し、djangoコンテナからmariadbコンテナのDBにアクセスできるような環境を作成したかったのですが、少し手間取ったので手順を備忘録としてまとめておきます。
環境
Raspberry Pi OS (32bit)で試しています。
pi@master:~ $ uname -a
Linux master 5.10.103-v7l+ #1529 SMP Tue Mar 8 12:24:00 GMT 2022 armv7l GNU/Linux
pi@master:~ $ docker --version
Docker version 20.10.17, build 100c701
pi@master:~ $ docker-compose --version
docker-compose version 1.21.0, build unknown
各コンテナのIPアドレスとポートフォワードの設定は以下のようになっています。それ以外のdocker-composeの設定詳細については割愛します。
- djangoコンテナ
- IP : 172.100.0.2 (172.100.0.0/24)
- ポート : 8888:8888
- mariadbコンテナ
- IP : 172.100.0.4 (172.100.0.0/24)
- ポート : 3306:3306
mariadb設定内容
mariadbコンテナで実施する設定内容です。
mariadbを外部から接続できるようにする
/etc/mysql/mariadb.conf.d/50-server.cnf
を編集し、bind-addressの設定をコメントアウトする。
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = 127.0.0.1 # ← この行をコメントアウトする
サービスをリスタートする。
service mysql restart
netstat -atn
を実行して、tcp6のローカルアドレスが:::3306となっていればOK。
外部接続用ユーザの作成と権限設定
mariadbにログインして以下のSQLを実行する。
/* DB作成 */
create database django;
/* ユーザ作成と権限設定 */
create user 'django'@'172.100.0.%' identified by 'password';
grant all on django.* to 'django'@'172.100.0.%';
/* ユーザのパスワード設定 */
set password for 'django'@'172.100.0.%' = password('password'); -- 例:パスワードを"password"に設定
/* 確認 */
select user, host from mysql.user; -- django | 172.100.0.% が出ればOK
django設定内容
djangoコンテナで実施する設定内容です。
settings.pyの修正
DATABASESの設定をmysql用に変更する。
docker-composeでhostnameをmariadbに設定しているため、HOSTはホスト名のmariadbで設定している。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django',
'USER': 'django',
'PASSWORD': 'password',
'HOST': 'mariadb',
'PORT': '3306',
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
}
}
ここまでの設定でdjangoコンテナとmariadbコンテナ間の通信が可能になっているはずです。
djangoコンテナ内でpython manage.py dbshell
を実行してmariadbコンテナのDBに接続できれば成功です。
ホストからdjangoコンテナで起動したアプリケーションにアクセスする
Windowsのブラウザ → コンテナが起動しているRaspberry Pi → djangoコンテナ
という関係性になっている場合の話になります。
-
Windowsのブラウザ → コンテナが起動しているRaspberry Pi
docker-composeで8888ポートをフォワーディングすることで接続できます。 -
コンテナが起動しているRaspberry Pi → djangoコンテナ
Raspberry Piのホストからdjangoコンテナへのアクセスを許可するよう設定が必要です。
djangoのsettings.pyのALLOWED_HOSTSの項目を修正します。今回は全許可で設定しています。
ALLOWED_HOSTS = ['*']
後はアプリケーション起動時にpython manage.py runserver 0.0.0.0:8888
とすることで、8888をlocalhostではなく全ホスト向けで立ち上げることができます。
これで、WindowsからRaspberry Pi上で起動しているコンテナにアクセスできます。