開発環境でタイトルの様なことを実現したい。
結論から言うと、通信したいコンテナを同じネットワークに配置すると通信が可能になる。
以下の様なRailsAPI、app1とapp2の通信を考える。
app1のdocker-compose
docker-compose.yml
version: '3'
services:
app1:
container_name: "app1"
build: .
volumes:
- ./:/usr/src/app
command: sh -c "rm -f tmp/pids/server.pid && yarn install --check-files && bundle exec rails s -p 3000 -b '0.0.0.0'"
ports:
- "3001:3000"
stdin_open: true
tty: true
app2のdocker-compose
docker-compose.yml
version: '3'
services:
app2:
container_name: "app2"
build: .
volumes:
- ./:/usr/src/app
command: sh -c "rm -f tmp/pids/server.pid && yarn install --check-files && bundle exec rails s -p 3000 -b '0.0.0.0'"
ports:
- "3002:3000"
stdin_open: true
tty: true
・app1 port 3001:3000
・app2 port 3002:3000
この設定のままだと、
app1から、
http.request(localhost:3002)
の様にしてAPIにアクセスしようとしても、
コンテナapp1では
localhost:3002 = app1の3002ポート と解釈されてしまうため当然app2にはアクセスできない。
じゃあどうすればいいのか。。。
解決法
app1とapp2を同じネットワークに配置する。
現在がこうだとすると。
container | network |
---|---|
app1 | app1_default |
app2 | app2_default |
こうする。
container | network |
---|---|
app1 | app1_default |
app2 | app1_default |
app2のdocker-compose.ymlに以下を追記
networks:
- app1_default
- app2_default #注1)
networks:
app1_default:
external: true
注1)実際のdocker-composeには複数のserviceが定義されてると思うので、それらとの接続に必要
この状態で
app1から
http.request(host.docker.internal:3002)
の様にすると、app2にアクセスできる。