フロントエンドとバックエンドが別々の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.localhost
やdocker.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)やってます。フォローしてもらえるとうれしいです!