dockerでサーバ間処理をローカル開発環境に構築しようとした時に躓いたこと


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_linksexternalという設定を入れて、サーバ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_linksexternalとなるようです。

これで、サーバAのサービス名とポート番号を指定してリクエストを投げて上げることで、無事疎通ができるはずです^ ^

dockerは奥が深いですね。

この記事はあくまで自分の解釈で書いたものなので、本当はこうなんだよ〜というのがあればコメントいただけると幸いです。