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 创建新的透明网络,请执行以下操作7
:10.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 的工具,如 ping
或 Test-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 网络:
- L2bridge 网络配置了与容器主机相同的 IP 子网
- 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(默认) | 非常适用于开发人员 |
|
通过管理 vNIC(已绑定到 WinNAT)路由 | 不直接支持:需要通过主机公开端口 |
透明 | 非常适用于开发人员或小型部署 |
|
通过能够直接访问(物理)网络适配器的容器主机进行路由 | 通过能够直接访问(物理)网络适配器的容器主机进行路由 |
Overlay | 适用于多节点;对于 Docker Swarm 是必需的,在 Kubernetes 中可用 |
|
不直接受到支持 - 需要第二个容器终结点(连接到 Windows Server 2016 上的 NAT 网络或 Windows Server 2019 上的 VFP NAT 规则)。 | 相同/跨子网:网络流量使用 VXLAN 封装并通过管理 vNIC 进行路由 |
L2Bridge | 用于 Kubernetes 和 Microsoft SDN |
|
在入口和出口重新写入容器 MAC 地址 |
|
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 是 |