目的
Docker Composeを使って作成されたコンテナたちは同一のネットワーク環境に属しているのかを確認していきます。
検証環境は先日記事にしたDockerとWSL2を使ってReact&Django&MySQLの開発環境を作るを利用します。
対象は上図のMySQL,Reat,Djangoが入っているコンテナになります。
docker-compose up
コマンドで作成されたこれら環境に対して各コンテナのネットワーク状況を見ていきます。
Dockerコンテナのネットワークについて
コンテナのために完全に分離された環境と定義されています。
Docker Composeで作成されたコンテナグループはデフォルトで同一のネットワークに所属するようです。(今回の確認事項)
詳しくはこちらの公式も参照してください。
それぞれのコンテナのネットワークを確認
コンテナ及びネットワークの確認
まずは立ち上げられたコンテナたちのIDを取得します。
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
37e563215f73 project_handson-back "python3" 2 minutes ago Up 2 minutes 0.0.0.0:8000->8000/tcp my-back
1138890b6da0 mysql:8.0.23 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 33060/tcp, 0.0.0.0:3308->3306/tcp my-db
d2ac311ff7c3 project_handson-front "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:3000->3000/tcp my-front
次に作成されたネットワークを確認します。
「{docker-compose.ymlが格納されているフォルダ名}_default」というネットワークができていることが確認できます。(今回はproject_default)
他に3つほどネットワークがありますが、それらはデフォルトで用意されているモノになりますので今回は無視していきます。
> docker network ls
NETWORK ID NAME DRIVER SCOPE
d36c75ca16f0 bridge bridge local
07cfce906ce6 host host local
454bad48e854 none null local
9542cb87b241 project_default bridge local
フロントエンド用コンテナのネットワーク
docker inspect <コンテナID>
を使ってコンテナ情報の詳細を表示します。
ここでは--format
オプションを使ってネットワークID情報のみを抽出します。
> docker inspect --format='{{range .NetworkSettings.Networks}}{{.NetworkID}}{{end}}' d2ac311ff7c3
9542cb87b2415f8e40ced2a3452b52548dfbdb3938eb6c8298afbb78867af8f2
バックエンド用コンテナのネットワーク
同様に
> docker inspect --format='{{range .NetworkSettings.Networks}}{{.NetworkID}}{{end}}' 37e563215f73
9542cb87b2415f8e40ced2a3452b52548dfbdb3938eb6c8298afbb78867af8f2
データベース用コンテナのネットワーク
同様に
> docker inspect --format='{{range .NetworkSettings.Networks}}{{.NetworkID}}{{end}}' 1138890b6da0
9542cb87b2415f8e40ced2a3452b52548dfbdb3938eb6c8298afbb78867af8f2
以上より。。。
どのコンテナもネットワークIは「9542cb87b2415f8e40ced2a3452b52548dfbdb3938eb6c8298afbb78867af8f2」となっている。
これよりDocer Composeによって作られたネットワークと同じことが確認できる。
> docker network ls
NETWORK ID NAME DRIVER SCOPE
d36c75ca16f0 bridge bridge local
07cfce906ce6 host host local
454bad48e854 none null local
9542cb87b241 project_default bridge local <-------- これ
コンテナ間の接続方法
ここまでで、各コンテナが同一のネットワークに所属していることが分かりました。
ついでにコンテナ間の接続URLも確認しておきましょう。
再度inspect
コマンドを使ってネットワーク配下のエイリアスを取得します。
> docker inspect --format='{{range .NetworkSettings.Networks}}{{.Aliases}}{{end}}' 37e563215f73
[my-back handson-back 37e563215f73]
取得できた値はそれぞれ
- my-back:サービス名
- handson-back:コンテナ名
- 37e563215f73:コンテナID
となります。
つまり、http://{エイリアス名}
のようにすればコンテナ間にて接続を行えます。
具体的にはこんな感じです。
http://my-back:8000
まとめ
Docker Composeで作られたコンテナ群はデフォルトで同一のネットワークに所属することが分かりました。
コンテナ単品で作成していく際は、ネットワークの作成及び明示的にどのネットワークに所属するかも指定しないといけません。
その辺を全部自動でやってくれるのは流石という感じですね。