-
Notifications
You must be signed in to change notification settings - Fork 0
MS_DockerForWindowsNetwork
-
TOP > コンテナ技術 > Docker for Windows
- Docker for Windowsのネットワーク設定
ネットワーク設定が解らなかったので。
移行メモ(前提の世代について): 本ページは Hyper-V バックエンド
(MobyLinuxVMという Hyper-V 仮想マシンを使う方式)を前提としている。
現在の Docker Desktop は既定で WSL 2 バックエンドになっており、
下記のDockerNAT/MobyLinuxVMは登場しない。
記述は当時の構成の記録として残し、
現行構成については末尾の補足にまとめた。
Windows ホストと各コンテナの間には、
DockerNAT > MobyLinuxVM がある。
-
Windows 上の Docker クライアントから
MobyLinuxVM へリモート接続(名前付きパイプを介して)している。 -
DockerNAT はデフォルトで、10.0.75.1/24 を Windows ホストに割り当てる。
- Windows ホストと MobyLinuxVM は、DockerNAT 経由で繋がっている。
- Docker Desktop 2.2.0 で、DockerNAT が廃止されたとのこと。
- Hyper-V の仮想マシン
- Linux のネイティブな Docker ホスト環境と Docker デーモン
- DockerNAT はデフォルトで、10.0.75.2/24 を MobyLinuxVM に割り当てる。
MobyLinuxVM と各コンテナは、
既定値では、Docker0 というネットワークで繋がっている。
MobyLinuxVM 上の Docker デーモンは、
172.17.0.0/16 の範囲で IP アドレスをコンテナに割り当てる。
-
「localhost:ポート番号」で接続可能。
-
ポート番号は、docker-compose.yml ファイルの
portsセクションに「ホスト・ポート:コンテナ・ポート」の書式で指定する。
各コンテナから、10.0.75.1 で、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 → Windows ホスト → 各コンテナを構成し外部 IP でブリッジ可能。
(コンテナ A → Windows ホスト → Windows ホストの外部 IP → Windows ホスト → コンテナ B)
補足(現在はユーザー定義ネットワークを使う): コンテナ間の通信を
ホストの 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 アドレスでアクセスする。
- 以下のルーティング設定を行い、
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 廃止に伴い、10.0.75.1 が、不要になる(と言うか使えなくなる)らしい。
- Missing DockerNAT after upgrading to Docker Desktop 2.2.0 on Windows · Issue #5538 · docker/for-win
https://github.com/docker/for-win/issues/5538
- Missing DockerNAT after upgrading to Docker Desktop 2.2.0 on Windows · Issue #5538 · docker/for-win
-
調べてみたトコロ、Windows ホストの外部 IP を使用すれば接続できる模様。
- ただし、異なる PC にデプロイした場合や、DHCP で IP が可変の場合は問題となる。
- このため、
host.docker.internalと言う DNS 名や、hosts ファイルで解決することもできる模様。 -
host.docker.internalは、コチラの様に名前解決される。
-
参考
- Qiita
- Dockerのコンテナの中からホストOS上のプロセスと通信する方法
https://qiita.com/ijufumi/items/badde64d530e6bade382 - Dockerコンテナ内からホストへ
localhostでアクセスしてみる
https://qiita.com/kai_kou/items/5182965ea75c85cf1e3f
- Dockerのコンテナの中からホストOS上のプロセスと通信する方法
- Qiita
補足(
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 の場合に開発環境でだけ通る、という差異を生みやすいので、
接続先はハードコードせず設定で外に出すのが安全である。
補足(元ページ記述後の変更): 現在の Docker Desktop は
既定で WSL 2 バックエンドを使う。構成は次のように変わっている。
旧(Hyper-V バックエンド) 現行(WSL 2 バックエンド) Docker デーモンの居場所 MobyLinuxVM(Hyper-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 バックエンドのみとなる。
-
Azure + Docker Compose + Hyper-Vで開発環境 - Azure登録 ~ Webサーバー立ち上げ
| Web技術Tips | ホームページ制作のDOE【横浜】
https://www.doe.co.jp/hp-tips/server/azure-docker-hyper-v01/ -
Dockerコンテナに外部からアクセスする方法 – ムッシューのIT備忘録
https://mussyu1204.myhome.cx/wordpress/it/?p=115 -
Docker for Windowsでsambaを使う - Qiita
https://qiita.com/KNaito/items/0d67fc2293e15c3960fc -
図解で理解できる(はず)Microsoftの仮想化技術
――Windows上で稼働するLinux、動かしているのはどのテクノロジー?(その2)(2/2):
その知識、ホントに正しい? Windowsにまつわる都市伝説(95) - @IT
https://www.atmarkit.co.jp/ait/articles/1710/24/news010_2.html -
Windows コンテナーネットワーク | Microsoft Docs
https://docs.microsoft.com/ja-jp/virtualization/windowscontainers/container-networking/architecture
Tags: Windows, Hyper-V, 仮想化
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。