ローカル環境上で起動する異なるDocker間で通信する方法まとめ

インフラ

フロントエンドとバックエンドが別々のDocker環境で管理されている場合など、異なるDocker環境どうしでアクセスをしたい時があります。
今回は異なるDocker環境のコンテナ間通信を実現する方法について紹介します。

方法1: Dockerネットワークを作成してネットワーク経由で通信をする

external: trueのDockerネットワークを共有することで、異なるDokcer環境でもコンテナ間の通信ができます。
docker-compose.ymlのイメージは以下の通りです。

frontend/docker-compose.yml

version: '3'
services:
  web:
    (略)
+   networks:
+     - external.group

+ networks:
+  external.group:
+   external: true

backend/docker-compose.yml

version: '3'
services:
  api:
    (略)
+   networks:
+     - external.group

+ networks:
+  external.group:
+   external: true

なお、外部通信用のDockerネットワークはdocker-compose upで自動的に作成されないため、Docker起動前に作成する必要があります。

### Dockerネットワーク作成
$ docker network create external.group

### Dockerネットワーク一覧確認
$ docker network ls

詳細解説はDockerネットワークとコンテナ名で実現する複数Docker Compose間の接続方法で紹介しています。

方法2: host.docker.internalを利用してローカル環境経由でコンテナにアクセスする

host.docker.internalとはDocker Desktopで用意されている、コンテナからローカル環境を参照する際のホスト名です。

過去にはdocker.for.mac.localhostdocker.for.mac.host.internalでローカル環境に接続できていましたが、Docker Desktop 4.3.0でそれらのホスト名は非推奨および削除予定とされています。1

host.docker.internalでローカル環境を参照し、接続対象のコンテナがローカル環境に開放しているポートでアクセスすれば異なるDocker環境でも通信ができます。

docker-compose.ymlのイメージは以下の通りです。

frontend/docker-compose.yml

version: '3'
  services:
    web:
(略)

backend/docker-compose.yml

version: '3'
  api:
    ports:
      - '3001:3000'
(略)

このとき、フロントエンドのwebコンテナからバックエンドのapiコンテナにはhttp://host.docker.internal:3001で接続できます。

詳細解説はローカル環境の異なるDocker Compose間の通信をhost.docker.internalで解決するで紹介しています。

さいごに

Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!

参考資料