dockerにてサーバ間処理を行えるようにローカル環境を構築。localhostに向けてAPIを叩いて値を取得しようとした矢先に、以下のようなエラーに遭遇。
サーバB上で"http://localhost:3000/(APIのURL)"にリクエスト
→Failed to connect to localhost port 3000: Connection refused
さてさて、困った^ ^;
環境
サーバA:APIサーバ(port:3000)
サーバB:フロントサーバ(port:4000)
サーバBがAPIを叩いて、サーバAへ処理をお願いする、そんなオーソドックスな構成です。
サーバの構成ファイルは別々のディレクトリで管理しています。
解決策
サーバBのdocker-compose.ymlにexternal_links
、external
という設定を入れて、サーバAと疎通が取れるようにしてあげました。
version: '3'
services:
front:
〜
external_links:
- (server_Aのサービス名)
〜
networks:
default:
external:
name: (server_Aのネットワーク名)
そしてAPIのリクエストを以下のように変更します。
"http://(server_Aのサービス名):3000/(APIのURL)"
何が問題だったのか?
そもそもサーバBからlocalhostにリクエストを投げることは、サーバB自身にリクエストを投げることと同義なのです。ループバックアドレスになっちゃうので・・・
そのため、docker上で外部のサーバAにリクエストを飛ばせるように設定を加える必要が出てきます。
その設定がexternal_links
、external
となるようです。
これで、サーバAのサービス名とポート番号を指定してリクエストを投げて上げることで、無事疎通ができるはずです^ ^
dockerは奥が深いですね。
この記事はあくまで自分の解釈で書いたものなので、本当はこうなんだよ〜というのがあればコメントいただけると幸いです。