Windows 中的進階網路選項

適用於: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(容器端點)埠處理所有已標記的流量。

指定網路的輸出NAT 原則

適用於 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 發生的位置,我們也需要指定 ExceptionList:

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 服務使用。 如果您要建立網路,您可以將 HNS 服務使用 選項 -o com.docker.network.windowsshim.networkname=<network name>docker network create 指定給命令的名稱。 例如,您可以使用下列命令來建立具有指定給 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 後綴,以及指定網路 DNS 伺服器的 選項 -o com.docker.network.windowsshim.dnsservers=<DNS SERVER/S> 。 例如,您可以使用下列命令將網路的 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.

我們正在處理平台變更,以自動偵測/防止此問題。 目前可以使用下列因應措施來確保主機電腦上已啟用IPv6:

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,然後嘗試將交換器系結至 (external) 網路適配器 - 適配卡可能是 VM 網路適配器或實體網路適配器。 如果已在容器主機上建立 vSwitch, 而且 Docker 可以看到它, 則 Windows Docker 引擎會使用該參數,而不是建立新的參數。 不過,如果 vSwitch 是在頻外建立的 (也就是使用 HYper-V 管理員或 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' 選項,將透明網络的外部 vSwitch 系結至容器主機上尚未使用的特定網路適配器(亦即超出頻外建立之 vSwitch 所使用的網络適配器)。 本檔的<在單一容器主機上建立多個透明網路>一節會進一步說明 '-o' 選項。

Windows Server 2016 Work-arounds

雖然我們繼續新增功能並推動開發,但部分功能將不會轉送至較舊的平臺。 相反地,最佳行動計劃是「上火車」,以取得 Windows 10 和 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.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 檔案參考