やろうとしたこと
ローカル開発環境でDockerを使用しており、APIの開発を担当することになった。
APIから外部業者のAPIを呼び出すが、外部業者のAPIの提供がまだであったため、動作確認を行うためにホストOSでモックサーバを動かし、ホストOSのローカルホストへ向けてAPIのリクエストを投げて動作確認を行うことが目的。
問題点
外部業者のAPIと仮定して起動したホストOSのモックサーバへのリクエストでエラーが発生した。
Failed to open TCP connection to localhost:8000 (Cannot assign requested address - connect(2) for "localhost" port 8000)
ホストOSからlocalhost:8000へ向けてAPIを叩くと通るので、Docker環境からのみ接続できない状況となっている。
解決までに試したこと
- 下記2点の状況を踏まえ、トライ&エラーの時間を短縮するためにDocker環境へ入って操作することにした
- .envへAPIのエンドポイントを定義していた(定義を変更したらコンテナを再立ち上げしていた)
- 外部業者を想定したAPIの実行でエラーとなるため、Docker環境からホストOSへ向けたAPIだけ実行できればよい
- Docker環境へ入って状況再確認
-
docker-compose exec {コンテナ内のイメージ名} bash
でdocker環境へ入る - 対象となるAPIのリクエストを投げて同じエラーとなることを確認、今回はGETSメソッドだったのでオプションは不要
-
curl http:/localhost:8000/:endpont_url/?Code=1234567890
※これはNGパターン
-
-
- 解決方法へたどり着くまで、外部業者のAPIを想定したモックサーバへ向けてAPIリクエストを投げた
解決方法
- docker desktop の環境であれば、
localhost
の代わりにhost.docker.internal
を指定する(特別なDNS名の指定)-
今回の例では
curl http:/host.docker.internal:8000/:endpont_url/?Code=1234567890
と実行して正常なレスポンスを受け取った -
Docker Desktop環境ではmac、WIndowsとも対応している
ホストOS 公式ドキュメントのURL mac https://matsuand.github.io/docs.docker.jp.onthefly/docker-for-mac/networking/ Windows https://matsuand.github.io/docs.docker.jp.onthefly/docker-for-windows/networking/
-
周辺情報
- 特別なDNS名を指定する以外にも解決方法はあるようです
- docker desktop 以外の環境とは?
- Dockerの入手ページの記載内容からすると、Linux版はDesktop版ではないようです
- 本番環境を構築するときに使用するもので、ホストOSを参照することはまれなケースのはず