概要
環境:Windows11 , WSL2 , Laravel9 , PHP8.1, nginx, mysql
開発環境で、二つのサービスはそれぞれ[WSL]内に別のdocker composeを使って作成されている。
きなこStacks内のPHPコンテナから、あんこStacksのDBコンテナを見たい!と思った時。
ネットサーバーにつなぐ時と同じように、connectionを変えればいいものとばかり思っていたが、繋がらなかった。
HOST=localhost
PORT=7002
どうやらDockerコンテナ同士が通信するにはDocker Networkが必要だったよう。
・ 通常、コンテナどうしは自由に通信できるわけでは無い。
・ docker composeでStacksを形成すると、自動的にNetworkが作成されることで、そのStacks内での通信が可能になっていた(...defaultのような名前のもの)。
・ 別Stacks同士で通信を行うには、このDocker Networkを自分で作成しなければならない。
解決方法
1. 共有したいDBがある方のdocker-compose.ymlを修正する。
//...
services:
db:
networks:
- default
- omochi-shared-network
//...
networks:
omochi-shared-network:
internal: false
name: omochi_shared_network
これでDocker Networkが作成され、そのネットワークにあんこStacksのdbコンテナが接続される。
2. 別StacksDBにアクセスしたい側のdocker-compose.ymlを修正する。
//...
services:
php:
networks:
- default
- omochi-shared-network
//...
networks:
omochi-shared-network:
external: false
name: omochi_shared_network
これでDocker Networkを通して、きなこStacksからあんこStacksのdbコンテナへのアクセスが可能となる。
3. envのホスト設定
Laravelの場合、この方法でDBにアクセスするときは
HOST=dbコンテナ名
//例 HOST=あんこ-db-1
にすることでアクセスが可能になる。
解説(もどき)
オプションのnameは作成するサービス名を指定できる。(指定しないとディレクトリの名前がくっついて長くなる。)
internalとexternalについてはこちらの記事が詳しい。というか全部この記事でよい。
注意点
コンテナ起動時に、指定されたDocker Networkが見つからない場合、コンテナが起動できない。
起動順を気を付ける必要がある。
なお、この記事にたどり着くまでにWSL内のコンテナがぐちゃぐちゃになっている場合、docker compose up -d --buildだけではうまくいかないことがある。
その場合はdocker compose up -d --build --force-recreateで治る場合がある。
そして、Laravelのenvもいじりまくっている場合は
php artisan config:clear
php artisan cache:clear
#https://qiita.com/Ping/items/10ada8d069e13d729701
キャッシュの削除も忘れずに。これで30分消費した。
駄文失礼しました。ちなみに餅はきなこ派です。
参考
https://www.timedia.co.jp/tech/20220628-tech/
https://tech.anti-pattern.co.jp/docker-compose/
https://matsu.teraren.com/blog/2022/05/28/error-response-from-daemon-network-not-found/
https://knowledge.sakura.ad.jp/16082/
https://qiita.com/YuitoSato/items/4a4b46f5670b45739a37
