はじめに
APIクライアントとAPIサーバを別Docker Composeで管理している場合、両者をDocker Networkでつなげる方法を記載します。
環境
- MacOS Version 10.15.5
- docker desktop Version 2.2.0.0 (42247)
- docker-compose version 1.25.2, build 698e2846
設定例
APIサーバ側のDocker Compose yaml
version: '3'
services:
api:
container_name: my-api-server
build:
context: ./
dockerfile: ./Dockerfile
ports:
- "5000:5000"
env_file:
- ./.env
environment:
- DB_HOST=db
depends_on:
- db
networks:
- db-net
- api-net
db:
image: mysql:5.7.22
container_name: my-api-mysql
command: mysqld --character-set-server=utf8mb4
volumes:
- ./db/init:/docker-entrypoint-initdb.d
- ./db/mysql/conf.d:/etc/mysql/conf.d
restart: always
hostname: db
environment:
- MYSQL_ROOT_PASSWORD=mysql
- MYSQL_DATABASE=mydb
networks:
- db-net
networks:
db-net: # APIサーバ<=>MySQL間用ネットワーク
api-net: # クライアント<=>APIサーバ間用ネットワーク
上記Docker Composeを立ち上げてAPIサーバ側のDockerネットワーク名を確認します。
$ cd my-api-server
$ docker-compose up -d
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
7f07cc870f0a bridge bridge local
22b2cc052945 host host local
77efc533d609 my-project_api-net bridge local
5d75d3a0f46c my-project_db-net bridge local
APIクライアント側のDocker Compose yaml
クライアント側では下記のようにAPI側で設定したDocker Networkをdefault:
, external:
, name:
で指定します。
version: '3'
services:
bff:
container_name: my-client-app
build: .
ports:
- "3000:3000"
env_file:
- ./.env
networks:
default:
external:
name: my-project_api-net # 確認したAPI側のDockerネットワーク名を指定
接続
クライアント側コンテナ内からAPIサーバを叩くとき、API側でcontainer_name
に指定した名前をドメインにすることでアクセスすることができます。
$ cd my-client-app
$ docker-compose up -d
$ docker exec -it my-client-app /bin/bash
$ curl http://my-api-server:5000/path