Skip to content

MS_DockerForWindowsNetwork

nishi_74322014 edited this page Aug 31, 2026 · 1 revision

Docker for Windowsのネットワーク設定

概要

ネットワーク設定が解らなかったので。

移行メモ(前提の世代について): 本ページは Hyper-V バックエンド
MobyLinuxVM という Hyper-V 仮想マシンを使う方式)を前提としている。
現在の Docker Desktop は既定で WSL 2 バックエンドになっており、
下記の DockerNAT / MobyLinuxVM は登場しない。
記述は当時の構成の記録として残し、
現行構成については末尾の補足にまとめた。

詳細

構成

Windows ホスト各コンテナの間には、
DockerNAT > MobyLinuxVM がある。

Windows ホスト

  • Windows 上の Docker クライアントから
    MobyLinuxVM へリモート接続(名前付きパイプを介して)している。

  • DockerNAT はデフォルトで、10.0.75.1/24 を Windows ホストに割り当てる。

DockerNAT

MobyLinuxVM

  • Hyper-V の仮想マシン
  • Linux のネイティブな Docker ホスト環境と Docker デーモン
  • DockerNAT はデフォルトで、10.0.75.2/24 を MobyLinuxVM に割り当てる。

Docker0

MobyLinuxVM各コンテナは、
既定値では、Docker0 というネットワークで繋がっている。

各コンテナ

MobyLinuxVM 上の Docker デーモンは、
172.17.0.0/16 の範囲で IP アドレスをコンテナに割り当てる。

接続例

Windows ホスト → 各コンテナ

  • 「localhost:ポート番号」で接続可能。

  • ポート番号は、docker-compose.yml ファイルの
    ports セクションに「ホスト・ポート:コンテナ・ポート」の書式で指定する。

各コンテナ → Windows ホストのローカルサービス

各コンテナから、10.0.75.1 で、Windows ホストのローカルサービスにブリッジ可能。

Windows ホストの外部IP → Windows ホスト → 各コンテナ

Windows ホストの IP アドレスで各コンテナにアクセスする。

  • Windows ファイアウォールの受信規則で、ポートを開放し、

  • Docker Desktop 2.1.0.5 以前

    • 以下のルーティング設定を行い、
      Windows ホストの IP アドレスを 10.0.75.1 にマップする。
>ipconfig
  IPv4 アドレス . . . . . . . . . . . .: yyy.yyy.yyy.yyy
  サブネット マスク . . . . . . . . . .: xxx.xxx.xxx.xxx
...

>route -p add 10.0.75.1 mask xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy
OK!

>route print
...
  • ルーティング設定を削除する場合は以下。
>route delete 10.0.75.1 mask xxx.xxx.xxx.xxx
OK!
  • Docker Desktop 2.2.0 以降
    既定で、Windows ホストの外部 IP で接続できる模様。

各コンテナ → Windows ホストの外部IP → 各コンテナ

補足(現在はユーザー定義ネットワークを使う): コンテナ間の通信を
ホストの IP で折り返す必要は、通常はない。
ユーザー定義のブリッジ ネットワークを作ってコンテナを同じネットワークに繋げば、
コンテナ名で名前解決して直接通信できる

docker network create mynet
docker run --network mynet --name api  ...
docker run --network mynet --name web  ...   # web から http://api:80 で到達

docker-compose では、同じ compose ファイル内のサービスが
自動的に同一ネットワークに載り、サービス名で名前解決できる
本ページが試みているホスト経由のブリッジは、
compose を使わずに個別の docker run で立てた場合の回避策として読むとよい。

Windows ホスト → MobyLinuxVM のIP → コンテナ

Windows ホストから、MobyLinuxVM の IP アドレスでアクセスする。

  • 以下のルーティング設定を行い、
    MobyLinuxVM の IP アドレスを 172.17.0.0 にマップする。
$ route add 172.17.0.0 MASK 255.255.0.0 10.0.75.2
  • ルーティング設定を削除する場合は以下。
$ route del 172.17.0.0

DockerNAT廃止

  • DockerNAT 廃止に伴い、10.0.75.1 が、不要になる(と言うか使えなくなる)らしい。

  • 調べてみたトコロ、Windows ホストの外部 IP を使用すれば接続できる模様。

    • ただし、異なる PC にデプロイした場合や、DHCP で IP が可変の場合は問題となる。
    • このため、host.docker.internal と言う DNS 名や、hosts ファイルで解決することもできる模様。
    • host.docker.internal は、コチラの様に名前解決される。
  • 参考

補足(host.docker.internal が現在の正解): 著者が最後にたどり着いた
host.docker.internal が、現在の推奨される方法である。

  • コンテナ → ホストhost.docker.internal で到達できる
    (Docker Desktop が特別な DNS 名として解決する)。
    IP を決め打ちしないため、DHCP でホストの IP が変わっても壊れない。
  • ただしこれは Docker Desktop(Windows / Mac)限定の機能で、
    Linux 上の Docker Engine には既定で存在しない
    --add-host=host.docker.internal:host-gateway を付けると使える)。

本番が Linux の場合に開発環境でだけ通る、という差異を生みやすいので、
接続先はハードコードせず設定で外に出すのが安全である。

補足:現在の WSL 2 バックエンドでの構成

補足(元ページ記述後の変更): 現在の Docker Desktop は
既定で WSL 2 バックエンドを使う。構成は次のように変わっている。

旧(Hyper-V バックエンド) 現行(WSL 2 バックエンド)
Docker デーモンの居場所 MobyLinuxVMHyper-V VM) WSL 2 のディストリビューション(docker-desktop
ホストとの接続 DockerNAT(10.0.75.0/24) WSL 2 の仮想スイッチ
コンテナへの接続 ポート公開 + ルーティング設定 localhost:ポート がそのまま通る
ホストへの接続 10.0.75.1 host.docker.internal

実務上の違いとして、

  • 性能:WSL 2 側のファイル システム(\\wsl$\…)に置いたソースは速いが、
    Windows 側(C:\…)をバインド マウントすると I/O が遅い。
  • IP は固定できない:WSL 2 の IP は再起動で変わるため、
    IP 決め打ちの構成はさらに成立しにくくなった。

なお、Hyper-V バックエンドも設定で選択できるが、
Windows Home では WSL 2 バックエンドのみとなる。

参考

開発基盤部会 Wiki

本 Wiki 内


Tags: Windows, Hyper-V, 仮想化

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally