⛑️
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 に移行しようとしたら、
接続できないというエラーが発生し、「そりゃそうだわ!」となりました🙄笑
Discussion