LoginSignup
0
0

More than 1 year has passed since last update.

docker-composeでdjango+mariadb環境を構築した際の備忘録

Posted at

やりたかったこと

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上で起動しているコンテナにアクセスできます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0