LoginSignup
0
2

More than 3 years have passed since last update.

複数のdocker-composeで立ち上げたコンテナ間の通信

Last updated at Posted at 2021-05-19

開発環境でタイトルの様なことを実現したい。

結論から言うと、通信したいコンテナを同じネットワークに配置すると通信が可能になる。

以下の様な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にアクセスできる。

参考

Qiita

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2