Dockerを使用する場合、通常、スタックを形成するサービスをコンテナー化し、コンテナー間ネットワーキングを使用してサービス間で通信します。コンテナ化されていないホスト上のサービスと通信するために、コンテナが必要になる場合があります。 localhostにアクセスする方法は次のとおりです または127.0.0.1 Dockerコンテナ内から。
WindowsおよびMac用のDockerDesktop18.03+は、host.docker.internalをサポートします localhostの機能するエイリアスとして 。コンテナ内でこの文字列を使用して、ホストマシンにアクセスします。
-
localhostおよび127.0.0.1–これらはコンテナに解決されます 。 -
host.docker.internal–これは外部ホストに解決されます。
ホストでMySQLサーバーを実行している場合、Dockerコンテナはhost.docker.internal:3306に接続することでサーバーにアクセスできます。 。これは、WindowsまたはMacマシンで作業している場合の最も簡単な手法です。
LinuxのDockerEngineユーザーは、host.docker.internalを有効にできます --add-hostからも docker runのフラグ 。このフラグでコンテナを起動して、ホスト文字列を公開します:
docker run -d --add-host host.docker.internal:host-gateway my-container:latest
--add-host フラグは、コンテナの/etc/hostsにエントリを追加します ファイル。上記の値は、host.docker.internalをマップします 実際のlocalhostと一致するコンテナのホストゲートウェイに接続します 価値。 host.docker.internalを置き換えることができます 必要に応じて、独自の文字列を使用します。
Dockerはhostを提供します コンテナがホストのネットワークスタックを共有できるようにするネットワーク。このアプローチは、localhostを意味します コンテナ内は、コンテナ自体ではなく、物理ホストに解決されます。
コンテナは、--network=hostを追加することにより、ホストネットワークで起動されます フラグ:
docker run -d --network=host my-container:latest
これで、コンテナはlocalhostを参照できます または127.0.0.1 直接。
Docker Composeを使用している場合は、コンテナのサービス定義を変更して、network_modeを含めます。 フィールド:
services:
my-service:
network_mode: host
このアプローチにはいくつかの注意点があります。使用する前に、すべての影響を考慮することが重要です。コンテナは通常、ホストのスタックとは別の独自のプライベートネットワークを取得します。 --network=hostを指定した場合 、コンテナはデフォルトでホストから共有ネットワーク設定を継承します。
コンテナによって公開されるすべてのポートは、ホスト上で公開されます 、-pで明示的に宣言されていない場合でも 国旗。コンテナのデフォルトのホスト名はホストのホスト名と一致しますが、これは--hostnameで変更できます。 フラグ。
ホストネットワークは、Dockerコンテナの分離モデルを破るセキュリティ上の懸念事項になる可能性があります。実行中のコンテナが互いに競合したり、ホスト環境で問題を引き起こしたりしないと確信しているシナリオでも、引き続き役立ちます。また、トラフィックが通過する仮想化レイヤーがないため、ホストネットワーキングモードはデフォルトのブリッジモードよりも高速です。
デフォルトのbridgeのコンテナから引き続きホストにアクセスできます ネットワーキングモード。 localhostではなく、DockerネットワークIPで参照する必要があります。 または127.0.0.1 。
ほとんどのDockerEngineインストールは、ホストを172.17.0.1として表します。 デフォルトのdocker0 ブリッジネットワーク。ホストで次のコマンドを実行すると、自分のIPを確認できます。
ip addr show docker0
ホストのDockerIPはinetに表示されます ライン。コンテナ内からこのIPアドレスに接続して、ホストで実行されているサービスに正常にアクセスします。
このアプローチの落とし穴の1つは、localhostに直接バインドするサービスに接続できない可能性があることです。 。サービスがDockerブリッジIPとlocalhostで接続をリッスンしていることを確認する必要があります および127.0.0.1 。それ以外の場合は、connection refusedが表示されます またはコンテナ内の同様のエラー。
Dockerコンテナの外部からマシンのlocalhostに到達する必要がある場合は、いくつかのオプションがあります 。 WindowsまたはMacを使用している場合は、組み込みのhost.docker.internalを使用することをお勧めします エイリアス。 Linuxユーザーは、--add-hostを使用して同様の設定を行うことができます。 コンテナを起動するときにフラグを立てます。
ホストネットワーキングモードは、コンテナがホストのネットワーキングスタックを共有できるようにするユニバーサルな代替手段です。 localhostを参照できます 直接ですが、リスクと制限を常に認識しておく必要があります。強力なネットワーク分離が必要な場合は、適切なオプションではありません。
ブリッジモードに固執することは、それをサポートするワークロードにとって最良のオプションです。ホストのサービスをDockerIPにバインドし、そのアドレスを使用してコンテナ内から接続します。これにより、Dockerのコンテナごとの仮想化ネットワーキングを使用しながら、必要なときにホストへのルートを提供できます。