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