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のコンテナごとの仮想化ネットワーキングを使用しながら、必要なときにホストへのルートを提供できます。