やりたいこと
docker環境で開発を行っていると、docker-compose.yml で管理しているMySQLのコンテナに対して、別の docker-compose.yml で管理しているアプリから接続したくなります。
1つの docker-compose.yml で管理している MySQLのコンテナとアプリのコンテナであれば、 link
を使うことで容易に参照できます。 docker-compose.yml が分かれると別のネットワークが割り当てられるので、コンテナ内のプロセスが直接通信できません。
TL;DR
MySQLのコンテナの 3306
ポートがホストにマッピングされているのであれば、アプリのコンテナからデフォルトゲートウェイのIPアドレスのマッピングされたポート番号に接続します。
アプリのコンテナのネットワークの状態を調べる
$ docker inspect app02-myapp | jq '.[0].NetworkSettings.Networks|keys'
[
"app02_default"
]
接続元になるコンテナに割り当てられたネットワーク名を調べます。 docker inspect
でコンテナ情報を取得して、 Networks
の下にあるネットワーク名を得ます。ネットワーク名がわかったら、 docker network inspect
でネットワークの設定を参照します。
$ docker network inspect app02_default | jq '.[0].IPAM.Config[0].Gateway'
"172.26.0.1"
ここで表示されたIPアドレスがクライアントアプリのデフォルトゲートウェイです。
クライアントアプリから接続する
クライアントアプリからMySQLに接続する際に指定するホストに 172.26.0.1
を、上の図であればホストの 13306
番ポートがマッピングされているので、ポート番号に 13306
を指定して接続します。
忘れずに行っておくこと
コンテナで動いているMySQLは任意の接続元からの接続を受け付ける状態にしておきます。