✨
DevContainer間で通信を行う
概要
- 2つのサービスA,Bがあり、それぞれVSCodeのdevcontainerを用いて開発をしている
- Aがフロントエンド、Bがバックエンドとして、AがBの提供するAPIを叩くためにはdevcontainer間で通信する必要がある
方法
- 独立しているコンテナ同士を同じネットワークに入れてあげることで通信できるようにする
共有ネットワークを作成
$ docker network create dev-network
ネットワークが作成されたことを確認する
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
3e104e91hoge bridge bridge local
f7ac9eccfuga dev-network bridge local
812cd714fizz host host local
ee1e3c96buzz none null local
devcontainer.jsonにネットワーク設定を追記
devcontainer.json
{
"name": "service A",
"runArgs": [
"--name=service_a",
"--network=dev-network"
]
}
devcontainer.json
{
"name": "service B",
"runArgs": [
"--name=service_b",
"--network=dev-network"
]
}
- A,Bそれぞれにネットワーク設定を追加する
-
--name
を指定することでコンテナ名で通信することができる
通信確認
-
Rebuild Container
を忘れない
$ docker network inspect dev-network
[
{
"Name": "dev-network",
--- 省略
"Containers": {
"279fff06368df01de415c4368d03142dfadebf6d13d68e6b127f4bc4f7f6hoge": {
"Name": "service_a",
--- 省略
},
"bba036f161f5f71487c937cad3debf808f4c30fc5668b610bdd2c008c3bbfuga": {
"Name": "service_b",
--- 省略
}
},
"Options": {},
"Labels": {}
}
]
-
docker network inspect
で確認するとcontainers
に記載されていてネットワークに接続されているのがわかる
# サービスAのコンテナ内
$ curl http://service_b:8080/health
{"status":"ok"}
- 例えばサービスBが
http://localhost:8080/health
というAPIを提供しているとすると、サービスAのコンテナ内のターミナルでAPIを叩けばその結果を取得することができる - コンテナ名で通信できる
注意点
- ネットワークは永続化されるため、不要になったら削除する
$ docker network rm dev-network
Discussion