Windows 容器网络驱动程序

适用于:Windows Server 2025、Windows Server 2022、Windows Server 2019、Windows Server 2016

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

NAT 网络驱动程序

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

提示

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

注意

重新启动后,在 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 交换机直接连接到物理网络。 可以从物理网络静态分配 IP(需要用户指定的 --subnet 选项)或使用外部 DHCP 服务器动态分配。

注意

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

要求:在虚拟化场景中使用此模式时(容器主机是 VM),需要进行 MAC 地址欺骗

创建透明网络

若要使用子网 10.244.0.0/24、网关 10.244.0.1、DNS 服务器 10.244.0.7 和 VLAN ID 7创建新的透明网络:

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 地址。 这也意味着,应在调试情况下使用基于 ICMP 的工具(如 pingTest-NetConnection)使用其 TCP/UDP 选项进行配置。

创建覆盖网络

若要使用子网 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 中,由于入口和出口上的第 2 层地址转换(MAC 重新写入)操作,容器网络流量将具有与主机相同的 MAC 地址。 在数据中心,这有助于缓解交换机需要了解有时生存期较短的容器的 MAC 地址的压力。 可以通过 2 种不同的方式配置 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 虚拟交换机建立桥接连接
  • 跨子网:通过容器主机路由
通过直接访问(物理)网络适配器的容器主机进行路由 通过直接访问(物理)网络适配器的容器主机进行路由
覆盖 适用于多节点;对于 Docker Swarm 是必需的,并且在 Kubernetes 中可用
  • 同一子网:通过 Hyper-V 虚拟交换机建立桥接连接
  • 跨子网:网络流量被封装后通过 Mgmt vNIC 进行路由
不受直接支持 - 需要将第二个容器终结点附加到 Windows Server 2016 上的 NAT 网络,或在 Windows Server 2019 上遵循 VFP NAT 规则。 相同子网/跨子网:使用 VXLAN 封装网络流量,并通过 Mgmt 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 Swarm 模式(内部 KVS)协同工作,为叠加网络提供 IPAM。 所有其他网络驱动程序都使用外部 IPAM。

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

服务发现

仅某些 Windows 网络驱动程序支持服务发现(Service Discovery)。

驱动程序名称 本地服务发现 全局服务发现
nat 是的 可与 Docker EE 搭配使用
覆盖 是的 是 与 Docker EE 或 kube-dns 配合使用
透明
l2bridge 可与 kube-dns 搭配使用 可与 kube-dns 搭配使用