初めに
docker composeで同時に作らなくても、後からコンテナ同士をネットワーク接続できる方法
以下のような状況と仮定して
- mysqlのコンテナ
db-mysql
と php のコンテナapp-php
のコンテナがあると仮定する -
app-php
のコンテナから、db-mysql
DB接続したい - 各コンテナは別々で管理(作成)されている
- wslのように、ローカル端末を使っている
特定コンテナの所属ネットワークグループを調査
docker inspect --format '{{ .NetworkSettings.Networks }}' [コンテナ名]
- 実行例
docker inspect --format '{{ .NetworkSettings.Networks }}' db-mysql
# map[mysql_default:0xc000548000]
# 上記のような実行結果が出る
このような場合、db-mysqlコンテナの属するネットワークグループはmysql_default
になる
コンテナにネットワークグループを追加
docker network connect [ネットワークグループ] [コンテナ名]
- 実行例
docker network connect mysql_default app-php
上記のようにコマンドを実行すると、app-phpのコンテナ内から、ホストに db-mysql を指定すると、接続することができる。
こうすることで、composeで作成した時と同じように名称でIP引用できる仕組みになる。
本来は expose のように、コンテナからしか接続できない仕組みにしたいときに使うのが一般的ではあるのでしょうが、ローカルの時はこんな風にやってしまってもよいのかと。
- 確認例
# コンテナ内に入る
docker exec -ti app-php bash
# 疎通確認
curl db-mysql:3306
最後に
過去記事をシナリオベースに改編。。。
ホストからコンテナにはlocalhostでつなげるが、コンテナ同士はlocalhostでつなげない。これ大事。
ちなみに、Linuxのようなサーバー上ではホストのLANのIPを指定すると問題なくつながるので、そんなやり方でもよいのでしょうが、、