Docker Composeで作成されるコンテナネットワークの確認

# 目的
Docker Composeを使って作成されたコンテナたちは同一のネットワーク環境に属しているのかを確認していきます。

検証環境は先日記事にした[DockerとWSL2を使ってReact&Django&MySQLの開発環境を作る](https://qiita.com/eiji-noguchi/items/42ce3679af910c22fc21)を利用します。

https://qiita.com/eiji-noguchi/items/42ce3679af910c22fc21

全体イメージはこんな感じです。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621838/bcf1a83c-4c68-975f-397c-9e0ab83fa432.png">

対象は上図のMySQL,Reat,Djangoが入っているコンテナになります。
`docker-compose up`コマンドで作成されたこれら環境に対して各コンテナのネットワーク状況を見ていきます。

# Dockerコンテナのネットワークについて
コンテナのために完全に分離された環境と定義されています。
Docker Composeで作成されたコンテナグループはデフォルトで同一のネットワークに所属するようです。（今回の確認事項）

詳しくはこちらの公式も参照してください。

https://docs.docker.jp/engine/userguide/networking/dockernetworks.html

# それぞれのコンテナのネットワークを確認
### コンテナ及びネットワークの確認
まずは立ち上げられたコンテナたちのIDを取得します。

```powershell
> 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
```

### 以上より。。。

:::note info
どのコンテナもネットワーク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で作られたコンテナ群はデフォルトで同一のネットワークに所属することが分かりました。
コンテナ単品で作成していく際は、ネットワークの作成及び明示的にどのネットワークに所属するかも指定しないといけません。
その辺を全部自動でやってくれるのは流石という感じですね。