Windows 容器网络驱动程序

适用范围:Windows Server 2022、Windows Server 2019、Windows Server 2016

除了利用 Docker 在 Windows 上创建的默认“nat”网络之外,用户还可以定义自定义容器网络。 可以使用 Docker CLI docker network create -d <NETWORK DRIVER TYPE> <NAME> 命令创建用户定义的网络。 在 Windows 上,有以下网络驱动程序类型可用:

NAT 网络驱动程序

附加到使用“nat”驱动程序创建的网络的容器将连接到 内部 Hyper-V 交换机,并从用户指定的 (--subnet 接收 IP 地址) IP 前缀。 支持从容器主机到容器终结点的端口转发/映射。

提示

可以通过 Docker 守护程序配置文件中的 设置自定义默认“nat”网络fixed-cidr使用的子网。

注意

重新启动后,在 Windows Server 2019 (或更高版本) 创建的 NAT 网络将不再保留。

创建 NAT 网络

使用子网 10.244.0.0/24创建新的 NAT 网络:

docker network create -d "nat" --subnet "10.244.0.0/24" my_nat

透明网络驱动程序

附加到使用“透明”驱动程序创建的网络的容器将通过 外部 Hyper-V 交换机直接连接到物理网络。 可使用外部 DHCP 服务器静态(需要用户指定的 --subnet 选项)或动态分配来自物理网络的 IP。

注意

由于以下要求,Azure VM 不支持通过透明网络连接容器主机。

要求:在虚拟化方案中使用此模式时, (容器主机是 VM) MAC 地址欺骗是必需的

创建透明网络

若要使用子网 、网关 10.244.0.1、DNS 服务器10.244.0.7和 VLAN ID 创建新的透明网络,请执行以下操作710.244.0.0/24

docker network create -d "transparent" --subnet 10.244.0.0/24 --gateway 10.244.0.1 -o com.docker.network.windowsshim.vlanid=7 -o com.docker.network.windowsshim.dnsservers="10.244.0.7" my_transparent

覆盖网络驱动程序

附加到覆盖网络的容器通常由容器业务流程协调程序(如 Docker Swarm 和 Kubernetes)使用,可以跨多个容器主机与附加到同一网络的其他容器通信。 每个覆盖网络都使用自己的 IP 子网创建,由专用 IP 前缀定义。 覆盖网络驱动程序使用 VXLAN 封装来实现租户容器网络之间的网络流量隔离,并允许跨覆盖网络重用 IP 地址。

要求:确保环境满足创建覆盖网络所需的 先决条件

需要:在 Windows Server 2019 上,这需要 KB4489899

需要:Windows Server 2016时,这需要 KB4015217

注意

在 Windows Server 2019 及更高版本上,Docker Swarm 创建的覆盖网络利用 VFP NAT 规则进行出站连接。 这意味着给定容器接收 1 个 IP 地址。 这也意味着,在调试情况下,应使用其 TCP/UDP 选项配置基于 ICMP 的工具,如 pingTest-NetConnection

创建覆盖网络

创建包含子网 10.244.0.0/24、DNS 服务器 168.63.129.16和 VSID 4096的新覆盖网络:

docker network create -d "overlay" --attachable --subnet "10.244.0.0/24" -o com.docker.network.windowsshim.dnsservers="168.63.129.16" -o com.docker.network.driver.overlay.vxlanid_list="4096" my_overlay

L2bridge 网络驱动程序

附加到使用“l2bridge”驱动程序创建的网络的容器将通过 外部 Hyper-V 交换机连接到物理网络。 在 l2bridge 中,容器网络流量将具有与主机相同的 MAC 地址,因为第 2 层地址转换 (MAC 重新写入) 入口和出口操作。 在数据中心,这有助于缓解交换机需要了解有时生存期较短的容器的 MAC 地址时的压力。 可以通过两种不同的方式配置 L2bridge 网络:

  1. L2bridge 网络配置了与容器主机相同的 IP 子网
  2. L2bridge 网络配置了新的自定义 IP 子网

在配置 2 中,用户需要在主机网络舱上添加一个充当网关的终结点,并为指定的前缀配置路由功能。

创建 l2bridge 网络

若要创建具有子网 10.244.0.0/24、网关 10.244.0.1、DNS 服务器 10.244.0.7 和 VLAN ID 7 的新 l2bridge 网络,请执行以下操作:

docker network create -d "l2bridge" --subnet 10.244.0.0/24 --gateway 10.244.0.1 -o com.docker.network.windowsshim.vlanid=7 -o com.docker.network.windowsshim.dnsservers="10.244.0.7" my_l2bridge

提示

L2bridge 网络具有高度可编程性;有关如何配置 l2bridge 的更多详细信息,可 在此处找到。

L2tunnel 网络驱动程序

创建与 l2bridge 相同,但 此驱动程序应仅在 Microsoft Cloud Stack (Azure) 中使用 。 与 l2bridge 的唯一区别是,所有容器流量都发送到应用 SDN 策略的虚拟化主机,从而为容器启用 Azure 网络安全组 等功能。

网络拓扑和 IPAM

下表显示了如何为每个网络驱动程序的内部连接(容器间连接)和外部连接提供网络连接。

网络模式/Docker 驱动程序

Docker Windows 网络驱动程序 典型用途 容器到容器(单节点) 容器到外部(单节点 + 多节点) 容器到容器(多节点)
NAT(默认) 非常适用于开发人员
  • 相同子网:通过 Hyper-V 虚拟交换机进行桥接
  • 跨子网:不受支持(只有一个 NAT 内部前缀)
通过管理 vNIC(已绑定到 WinNAT)路由 不直接支持:需要通过主机公开端口
透明 非常适用于开发人员或小型部署
  • 相同子网:通过 Hyper-V 虚拟交换机进行桥接
  • 跨子网:通过容器主机路由
通过能够直接访问(物理)网络适配器的容器主机进行路由 通过能够直接访问(物理)网络适配器的容器主机进行路由
Overlay 适用于多节点;对于 Docker Swarm 是必需的,在 Kubernetes 中可用
  • 相同子网:通过 Hyper-V 虚拟交换机进行桥接
  • 跨子网:网络流量通过管理 vNIC 进行封装和路由
不直接受到支持 - 需要第二个容器终结点(连接到 Windows Server 2016 上的 NAT 网络或 Windows Server 2019 上的 VFP NAT 规则)。 相同/跨子网:网络流量使用 VXLAN 封装并通过管理 vNIC 进行路由
L2Bridge 用于 Kubernetes 和 Microsoft SDN
  • 相同子网:通过 Hyper-V 虚拟交换机进行桥接
  • 跨子网:在入口和出口重新写入容器 MAC 地址并路由
在入口和出口重新写入容器 MAC 地址
  • 相同子网:桥接
  • 跨子网:通过 WSv1809 及更高版本上的 Mgmt vNIC 进行路由
L2Tunnel 仅限 Azure 相同/跨子网:固定到策略所应用于的物理主机的 Hyper-V 虚拟交换机 流量必须经过 Azure 虚拟网络网关 相同/跨子网:固定到策略所应用于的物理主机的 Hyper-V 虚拟交换机

IPAM

系统以不同方式为每个网络驱动程序分配 IP 地址。 Windows 使用主机网络服务 (HNS) 为 nat 驱动程序提供 IPAM,并使用 Docker 群模式(内部 KVS)为 overlay 驱动程序提供 IPAM。 所有其他网络驱动程序都使用外部 IPAM。

网络模式/驱动程序 IPAM
NAT 主机网络服务从内部 NAT 子网前缀 (HNS) 动态 IP 分配和分配
透明 对容器主机网络前缀内的 IP 地址进行静态或动态(使用外部 DHCP 服务器)IP 分配和指定
覆盖 根据 Docker 引擎群模式管理的前缀进行动态 IP 分配并通过 HNS 进行指定
L2Bridge 主机网络服务 (HNS) 从提供的子网前缀进行动态 IP 分配和分配
L2Tunnel 仅限 Azure - 通过插件进行动态 IP 分配和指定

服务发现

只有某些 Windows 网络驱动程序才支持服务发现。

驱动程序名称 本地服务发现 全局服务发现
nat YES 是(通过 Docker EE)
overlay YES 使用 Docker EE 或 kube-dns 是
transparent
l2bridge 使用 kube-dns 是 使用 kube-dns 是