完成イメージ図
前提
docker-composeで別々のRails Appを立ち上げておいてください。
こちらではdocker-composeでの設定のみ書きます。
※ ネットワーク等の設定値は参照先にある記事を参考にしています
※ DB = MySQL
したいこと
ローカルで別々のdocker-composeで立ち上げたRails App間でAPI通信がしたい。
e.g. イメージ図のRails App2のAPIをRails App1から叩きたい
何もしない状態で通信してみた時のエラー
キーワードからこのメモにたどり着けるように残しておきます。
Errno::ECONNREFUSED: Connection refused - connect(2)
概要
- 共通ネットワーク作成
- それぞれのdocker-compose.ymlのservicesに共通ネットワーク設定
- リクエストが届くか確認
- 完成
手順
-
docker network create --driver bridge common_link
(共通ネットワーク作成) -
docker network ls
(作成したネットワーク確認) - Rails App1とRails App2のdocker-compose.ymlのservicesの階層に
networks:
を定義
docker-compose.yml
services:
.
.
networks:
common_link:
external: true
- Rails App1, DB1, Rails App2, DB2それぞれのコンテナ設定箇所で
networks
を定義
services:
rails_app1:
networks:
- common_link
db1:
networks:
- common_link
- docker-compose2のMySQLのポートを3306と被らないようにするためにdocker-compose.ymlの修正
services:
db2:
ports:
- "127.0.0.1:3307:3307"
- docker-compose2のRails App2でMySQLをバインドする設定があるなら同じくポート値を変更
services:
rails_app2:
environment:
DATABASE_URL: mysql2://root:root@mysql:3307
- docker-compose2のMySQLのconfigにポート指定
e.g. /Dockerfiles/mysql/conf.d/mysql.cnf
[client]
port=3307
[mysqld]
port=3307
- docker-compose1とdocker-compose2の両方起動
-
docker network inspect common_link
(Rails App1, DB1, Rails App2, DB2の計4つのコンテナが同じネットワークに属している確認)
-
問題なさそうならping, curl, API叩いたりしてみてください
- docker-compose exec rails_app1 bash
-
ping 172.19.0.5
# 上の仮画像で確認したIP(172.19.0.5)を仮にrails_app2とした場合 curl 172.19.0.5
-
完成です。お疲れ様でした。
他に良い設定あったら教えてください。
参照先