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 ID 设置为网络专用

适用于透明和 l2bridge 网络驱动程序

若要为网络设置 VLAN ID,请使用选项 -o com.docker.network.windowsshim.vlanid=<VLAN ID>docker network create 命令。 例如,可以使用以下命令创建 VLAN ID 为 11 的透明网络:

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

为网络设置 VLAN ID 时,将为将附加到该网络的任何容器终结点设置 VLAN 隔离。

确保你的主机网络适配器(物理)处于中继模式,以便 vSwitch 能在正确的 VLAN 上通过访问模式下的 vNIC(容器终结点)端口处理所有标记流量。

为网络指定出站NAT 策略

适用于 l2bridge 网络

通常,使用 docker network create创建 l2bridge 容器网络时,容器终结点没有应用 HNS 出站NAT 策略,从而导致容器无法访问外部世界。 如果要创建网络,可以使用 -o com.docker.network.windowsshim.enable_outboundnat=<true|false> 选项来应用 OutboundNAT 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 服务使用。 如果要创建网络,可以通过使用 docker network create 命令的 -o com.docker.network.windowsshim.networkname=<network name> 选项来指定 HNS 服务提供的名称。 例如,可以使用以下命令创建一个透明网络,并将其名称指定给 HNS 服务:

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

将网络绑定到特定网络接口

适用于除“nat”以外的所有网络驱动程序

若要将网络(通过 Hyper-V 虚拟交换机附加)绑定到特定网络接口,请使用 docker network create 命令的 -o com.docker.network.windowsshim.interface=<Interface> 选项。 例如,可以使用以下命令创建附加到“以太网 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 虚拟机,并将利用默认的 HNS“nat”内部虚拟交换机。

Moby Linux VM 将 DockerNAT 开关与 Docker for Windows 配合使用(Docker CE产品)

Windows 10 上的 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

如果正在运行 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 不可见)可能会阻止透明网络创建

如果在创建透明网络时遇到错误,则可能是 Docker 未自动发现系统上存在外部 vSwitch,因此阻止透明网络绑定到容器主机的外部网络适配器。

创建透明网络时,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”选项将透明网络的外部 vSwitch 绑定到容器主机上尚未使用的特定网络适配器(例如,不是由带外创建的 vSwitch 使用的网络适配器)。 本文档的“在单个容器主机上创建多个透明网络”部分进一步介绍了“-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(网关、172.16.1.1.1)和 172.16.2.0/24(网关 172.16.2.1)创建两个 NAT 网络。

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 文件参考