共用方式為


Windows 中的進階網路選項

適用於:Windows Server 2025、Windows Server 2022、Windows Server 2019、Windows Server 2016

支援數種網路驅動程式選項,以便充分利用 Windows 特定的功能與特性。

切換內嵌小組與 Docker 網路

適用於所有網路驅動程式

藉由使用 -o com.docker.network.windowsshim.interface 選項指定多個網路適配器(以逗號分隔),即可利用 交換器內嵌小組 建立容器主機網路供 Docker 使用。

C:\> docker network create -d transparent -o com.docker.network.windowsshim.interface="Ethernet 2", "Ethernet 3" TeamedNet

設定網路的 VLAN 識別碼

適用於透明和 L2bridge 網路驅動程式

若要設定網路的 VLAN 識別碼,請將選項 -o com.docker.network.windowsshim.vlanid=<VLAN ID> 與命令 docker network create 搭配使用。 例如,您可以使用下列命令來建立具有 VLAN 識別碼為 11 的透明網路:

C:\> docker network create -d transparent -o com.docker.network.windowsshim.vlanid=11 MyTransparentNetwork

當您設定網路的 VLAN 識別碼時,您要針對要連結至該網路的任何容器端點設定 VLAN 隔離。

請確定您的主機網路適配器(實體)處於主幹模式,讓 vSwitch 在正確的 VLAN 上以存取模式使用 vNIC(容器端點)埠處理所有已標記的流量。

指定網路的 OutboundNAT 策略

適用於 l2bridge 網路

一般而言,當您使用 docker network create建立 l2bridge 容器網路時,容器端點不會套用 HNS 輸出NAT 原則,導致容器無法連線到外部世界。 如果您要建立網络,您可以使用 [-o com.docker.network.windowsshim.enable_outboundnat=<true|false>] 選項來套用輸出NAT HNS 原則,為容器提供外部世界的存取權:

C:\> docker network create -d l2bridge -o com.docker.network.windowsshim.enable_outboundnat=true MyL2BridgeNetwork

如果有一組目的地(例如容器對容器連線是必要的),我們不希望在這些地方發生 NAT,我們也需要指定一個例外清單:

C:\> docker network create -d l2bridge -o com.docker.network.windowsshim.enable_outboundnat=true -o com.docker.network.windowsshim.outboundnat_exceptions=10.244.10.0/24

指定 HNS 服務的網路名稱

適用於所有網路驅動程式

一般而言,當您使用 docker network create建立容器網路時,您提供的網路名稱會由 Docker 服務使用,而不是由 HNS 服務使用。 如果您要建立網路,您可以使用 -o com.docker.network.windowsshim.networkname=<network name> 選項在 docker network create 命令中指定 HNS 服務提供的名稱。 例如,您可以使用下列命令來建立具有指定給 HNS 服務之名稱的透明網路:

C:\> docker network create -d transparent -o com.docker.network.windowsshim.networkname=MyTransparentNetwork MyTransparentNetwork

將網路系結至特定網路介面

適用於 『nat』 以外的所有網路驅動程式

若要將網路 (透過 Hyper-V 虛擬交換器連結) 系結至特定網路介面,請使用 選項,-o com.docker.network.windowsshim.interface=<Interface>docker network create 命令。 例如,您可以使用下列命令來建立連結至 「Ethernet 2」 網路介面的透明網路:

C:\> docker network create -d transparent -o com.docker.network.windowsshim.interface="Ethernet 2" TransparentNet2

注意:com.docker.network.windowsshim.interface 的值是網路介面卡的 名稱,其可透過以下方法找到:

PS C:\> Get-NetAdapter

指定網路的 DNS 後綴和/或 DNS 伺服器

適用於所有網路驅動程式

使用 選項,-o com.docker.network.windowsshim.dnssuffix=<DNS SUFFIX> 指定網路的 DNS 後綴,以及選項,-o com.docker.network.windowsshim.dnsservers=<DNS SERVER/S> 指定網路的 DNS 伺服器。 例如,您可以使用下列命令將網路的 DNS 後綴設定為 「example.com」,並將網路的 DNS 伺服器設定為 4.4.4.4 和 8.8.8.8:

C:\> docker network create -d transparent -o com.docker.network.windowsshim.dnssuffix=abc.com -o com.docker.network.windowsshim.dnsservers=4.4.4.4,8.8.8.8 MyTransparentNetwork

VFP

如需詳細資訊,請參閱本文

秘訣 & 見解

以下是一份方便的秘訣和深入解析列表,靈感來自我們從社群聽到的 Windows 容器網络常見問題...

HNS 要求在容器主機計算機上啟用 IPv6

KB4015217 HNS 需要 Windows 容器主機上啟用 IPv6。 如果您遇到錯誤,例如下列錯誤,您的主計算機上有可能停用IPv6。

docker: Error response from daemon: container e15d99c06e312302f4d23747f2dfda4b11b92d488e8c5b53ab5e4331fd80636d encountered an error during CreateContainer: failure in a Windows system call: Element not found.

```output
We're working on platform changes to automatically detect/prevent this issue. Currently the following workaround can be used to ensure IPv6 is enabled on your host machine:

```output
C:\> reg delete HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters  /v DisabledComponents  /f

Windows 上的 Linux 容器

新功能: 我們正努力在沒有Moby Linux VM 的情況下,並行執行Linux和Windows容器。 如需詳細資訊,請參閱此 部落格文章,以瞭解 Windows 上的 Linux 容器 (LCOW)。 以下說明如何 開始使用

注意:LCOW 即將取代Moby Linux VM,而且會利用預設的 HNS “nat” 內部 vSwitch。

Moby Linux VM 搭配 Docker for Windows 使用 DockerNAT 交換器(Docker CE產品)

Windows 上的 Docker for Windows (適用於 Docker CE 引擎的 Windows 驅動程式)將會使用名為 'DockerNAT' 的內部 vSwitch,將 Moby Linux VM 連線到容器主機。 在 Windows 上使用 Moby Linux VM 的開發人員應該注意其主機使用 DockerNAT vSwitch,而不是 HNS 服務所建立的 “nat” vSwitch (這是用於 Windows 容器的預設參數)。

若要在虛擬容器主機上使用 DHCP 進行 IP 指派,請啟用 MACAddressSpoofing

如果容器主機已虛擬化,而且您想要使用 DHCP 進行IP指派,您必須在虛擬機的網路適配器上啟用MACAddressSpoofing。 否則,Hyper-V 主機會封鎖來自 VM 中具有多個 MAC 位址之容器的網路流量。 您可以使用下列 PowerShell 命令來啟用 MACAddressSpoofing:

PS C:\> Get-VMNetworkAdapter -VMName ContainerHostVM | Set-VMNetworkAdapter -MacAddressSpoofing On

如果您以 Hypervisor 身分執行 VMware,則必須啟用雜交模式,才能運作。 如需詳細資訊,請參閱這裡

在單一容器主機上建立多個透明網路

如果您要建立多個透明網路,您必須指定外部 Hyper-V 虛擬交換器應該繫結至哪個 (虛擬) 網路適配器。 若要指定網路的介面,請使用下列語法:

# General syntax:
C:\> docker network create -d transparent -o com.docker.network.windowsshim.interface=<INTERFACE NAME> <NETWORK NAME>

# Example:
C:\> docker network create -d transparent -o com.docker.network.windowsshim.interface="Ethernet 2" myTransparent2

請記得在使用靜態 IP 指派時指定 --subnet--gateway

使用靜態 IP 指派時,您必須先確定建立網路時會指定 --subnet--gateway 參數。 子網和閘道IP位址應該與容器主機的網路設定相同,也就是實體網路。 例如,以下說明如何建立透明網路,然後使用靜態IP指派在該網路上執行端點:

# Example: Create a transparent network using static IP assignment
# A network create command for a transparent container network corresponding to the physical network with IP prefix 10.123.174.0/23
C:\> docker network create -d transparent --subnet=10.123.174.0/23 --gateway=10.123.174.1 MyTransparentNet
# Run a container attached to MyTransparentNet
C:\> docker run -it --network=MyTransparentNet --ip=10.123.174.105 windowsservercore cmd

L2Bridge 網路不支援 DHCP IP 指派

使用 l2bridge 驅動程式建立的容器網路僅支持靜態 IP 指派。 如上所述,請記得使用 --subnet--gateway 參數來建立針對靜態 IP 指派設定的網路。

利用外部 vSwitch 的網路必須各自有自己的網路適配器

請注意,如果在相同的容器主機上建立多個使用外部 vSwitch 進行連線的網路(例如透明、L2 網橋、L2 透明),則每個網路都需要自己的網路適配器。

執行中與已停止容器的IP指派

靜態IP指派會直接在容器的網路適配器上執行,而且只有在容器處於STOPPED狀態時才執行。 容器執行時,不支援容器網路適配器或網路堆疊變更的「熱新增」(在 Windows Server 2016 中)。

現有的 vSwitch (Docker 無法看到)可能會阻礙透明網路的建立

如果您在建立透明網路時發生錯誤,可能是您的系統上有一個外部 vSwitch,而 Docker 並未自動探索,因此會防止透明網路系結至容器主機的外部網路適配器。

建立透明網路時,Docker 會為網路建立外部 vSwitch,然後嘗試將交換器綁定至外部網路卡 - 該網路卡可能是 VM 網路介面卡或實體網路介面卡。 如果已在容器主機上建立 vSwitch,且 Docker 可以看到它, Windows Docker 引擎會使用該參數,而不是建立新的參數。 不過,如果 vSwitch 是頻外建立的(也就是使用 HYper-V Manager 或 PowerShell 在容器主機上建立),而且 Docker 還看不到,則 Windows Docker 引擎會嘗試建立新的 vSwitch,然後無法將新的交換器連線到容器主機外部網路適配器(因為網路適配器已經連線到頻外建立的交換器)。

例如,如果您在 Docker 服務執行時先在主機上建立新的 vSwitch,則會發生此問題,然後嘗試建立透明網路。 在此情況下,Docker 無法辨識您所建立的交換器,而且會為透明網路建立新的 vSwitch。

解決此問題的方法有三種:

  • 當然,您可以刪除頻外建立的 vSwitch,這可讓 Docker 建立新的 vSwitch 並將它連線到主機網路適配器,而不會有問題。 選擇此方法之前,請確定您的頻外 vSwitch 不會由其他服務使用(例如 Hyper-V)。
  • 或者,如果您決定使用頻外建立的外部 vSwitch,請重新啟動 Docker 和 HNS 服務,以 讓 Docker 顯示交換器。
PS C:\> restart-service hns
PS C:\> restart-service docker
  • 另一個選項是使用 '-o com.docker.network.windowsshim.interface' 選項,將透明網絡的外部虛擬交換器綁定至在容器主機上尚未被使用的特定網絡適配器(亦即帶外建立之虛擬交換器所使用的網絡適配器以外的網絡適配器)。 本檔的 在單一容器 主機上建立多個透明網路一節中會進一步說明 '-o' 選項。

Windows Server 2016 解決方法

雖然我們繼續新增功能並推動開發,但部分功能將不會轉送至較舊的平臺。 反之,最佳的行動計劃是「搭上列車」,以獲得 Windows 和 Windows Server 的最新更新。 下一節列出一些適用於 Windows Server 2016 和舊版 Windows 10 的解決方法和注意事項(也就是 1704 Creators Update 之前)

WS2016 容器主機上的多個 NAT 網路

任何新 NAT 網路的區段都必須建立在較大的內部 NAT 網路前綴之下。 您可以從 PowerShell 執行下列命令並參考 「InternalIPInterfaceAddressPrefix」 字段來找到前置詞。

PS C:\> Get-NetNAT

例如,主機的 NAT 網路內部位址前綴可能是 172.16.0.0/16。 在此情況下,只要 Docker 是 172.16.0.0/16 前置詞的子集,就可以 建立其他 NAT 網路。 例如,可以使用IP前綴172.16.1.0/24建立兩個 NAT 網路(閘道、172.16.16.16.1.1)和172.16.2.0/24(網關,172.16.2.1)。

C:\> docker network create -d nat --subnet=172.16.1.0/24 --gateway=172.16.1.1 CustomNat1
C:\> docker network create -d nat --subnet=172.16.2.0/24 --gateway=172.16.1.1 CustomNat2

您可以使用下列方式列出新建立的網路:

C:\> docker network ls

Docker Compose

Docker Compose 可用來定義及設定容器網路,以及將使用這些網路的容器/服務。 Compose 'networks' 金鑰是用來定義容器所連接的網路的最上層密鑰。 例如,下列語法會定義 Docker 所建立的預先存在 NAT 網路,以做為指定 Compose 檔案中定義之所有容器/服務的「預設」網路。

networks:
 default:
  external:
   name: "nat"

同樣地,下列語法可用來定義自定義NAT網路。

注意:下列範例中定義的「自定義 NAT 網路」是容器主機預先存在的 NAT 內部前綴的分區。 如需更多內容,請參閱上一節<多個 NAT 網路>。

networks:
  default:
    driver: nat
    ipam:
      driver: default
      config:
      - subnet: 172.16.3.0/24

如需使用 Docker Compose 定義/ 設定容器網路的詳細資訊,請參閱 Compose 檔案參考