⛑️

Docker | host.docker.internal でコンテナからホスト上のサービスにアクセスする

2023/10/02に公開

コンテナからホスト上のサービスにアクセスする

コンテナから、ホスト上で起動しているサービスにアクセスする必要があったので、
備忘録として記事に残したいと思います。

ユースケース : ローカル環境でデバッグ中のサービスに、コンテナからアクセスしたい

Docker host.docker.internal ユースケース

host.docker.internal を使用する

ホスト上で内部の IP アドレスで名前解決できる、特定の DNS 名 host.docker.internal を使用することで、コンテナからホスト上のサービスにアクセスすることができます。

$ curl http://host.docker.internal:3000/v1/health
{"status":200}

localhost ではアクセスできない

コンテナ上での localhost はコンテナ自身を参照してしまうので、意図した動作はしません。

$ curl http://localhost:3000/v1/health
curl: (7) Failed to connect to localhost port 3000 after 0 ms: Couldn't connect to server

注意

ドキュメントには以下のように記載されており、
host.docker.internal は Docker Desktop を使用した環境で動作します。
この方法は、開発環境でのみ使用するようにしたほうが良いでしょう。

Mac

これはホスト上で内部の IP アドレスで名前解決します。
これは開発用途であり、Docker Desktop for Mac 外の本番環境では動作しません。

Windows

この DNS は、ホストが利用する内部 IP アドレスを名前解決します。
これは開発環境において用いられるものであり、Docker Desktop for Windows の範囲外にある本番環境では動作しません。

まとめ

host.docker.internal を使うことで、
コンテナからホスト上のサービスにアクセスできることが分かりました。

今回は作成したツールの実行環境をローカルから Docker に移行しようとしたら、
接続できないというエラーが発生し、「そりゃそうだわ!」となりました🙄笑

参考

コラボスタイル Developers

Discussion