Windows 容器的网络概念
标准 Windows 计算机中的处理器具有内核模式和用户模式。 核心 OS 组件和大多数设备驱动程序在内核模式下运行,而应用在用户模式下运行。 在计算机上实现容器时,每个容器创建一个独立的轻量级环境,以在主机 OS 上运行应用。 容器共享大多数主机 OS 内核,以便访问文件系统和注册表。
Windows 容器需要容器 OS。 容器依靠 OS 内核来管理服务,例如文件系统、网络、进程调度和内存管理。 容器 OS 是已打包运行时包含的 OS。 可将不同版本的 Windows 与容器配合使用,使得可访问特定 OS 功能或其他所需的软件。
网络隔离和安全性
Windows 容器支持两种类型的运行时隔离:进程和 Hyper-V。 主要区别在于在容器、主机 OS 和主机上的其他容器之间创建的隔离程度。
进程隔离是最常见的方法。 在同一主机上运行的多个容器实例通过命名空间和资源控制设置以及其他进程隔离功能实现隔离。
- 每个容器与主机上的主机 OS 和其他容器共享相同的内核。
- 每个容器有一个连接到虚拟交换机的虚拟网络适配器。
- 每个容器终结点放置在其自己的网络命名空间中。 默认网络命名空间是主机虚拟网络适配器和主机网络堆栈的位置。
Hyper-V 隔离在主机和容器之间提供了增强的安全性和更广泛的兼容性。 多个容器实例在同一主机上运行,但每个容器在优化的虚拟机中运行。 虚拟机在每个容器和容器主机之间提供硬件级隔离。
- 每个容器实质上有自己的内核。
- 若要在主机上的容器之间强制实施网络隔离,则为每个容器创建一个网络命名空间。
- 容器在安装容器的虚拟网络适配器的 Hyper-V 隔离下运行。 Windows Server 容器使用主机虚拟网络适配器附加到虚拟交换机。 Hyper-V 隔离使用综合虚拟机网络适配器(未向实用工具虚拟机公开)附加到虚拟交换机。
使用主机网络服务 (HNS) 的网络管理
Windows 使用主机网络服务 (HNS) 和主机计算服务 (HCS) 创建容器并将终结点附加到网络。
- 网络:HNS 为每个网络创建 Hyper-V 虚拟交换机,HNS 创建所需的 NAT 和 IP 池。
- 终结点:HNS 为每个容器终结点创建网络命名空间,HNS/HCS 将虚拟网络适配器添加到命名空间。 HNS 创建虚拟交换机端口。 HNS 根据配置的网络驱动程序模式,将 IP 地址、域名系统 (DNS) 信息、路由等分配到终结点。
- 策略:对于默认 NAT 网络,HNS 使用相应的 Windows 防火墙“允许”规则创建 WinNAT 端口转发规则和映射。 对于所有其他网络,HNS 使用虚拟筛选平台 (VFP) 为负载均衡、ACL 和封装创建策略。
防火墙交互
根据容器配置和网络驱动程序的类型,端口 ACL 由 Windows 防火墙和 Azure 虚拟筛选平台 (VFP) 的组合强制实施。 以下值使用 Windows 主机的防火墙(启用了网络命名空间)和 VFP:
- 默认出站:全部允许。
- 默认入站:允许所有(TCP、UDP、ICMP、IGMP)未经请求的网络流量。 拒绝所有非来自这些协议的其他网络流量。
网络驱动程序
Windows 支持 Docker 容器的五种不同的网络驱动程序或模式:NAT、透明、覆盖、L2Bridge 和 L2Tunnel。 除了由 Windows 上的 Docker 创建的默认 NAT 网络之外,还可通过在 Docker CLI 中使用 docker network create
命令来定义自定义容器网络。
下表总结了适用于 Windows 上的 Docker 容器的网络驱动程序类型。 选择满足物理网络基础结构和主机(单节点或多节点)配置的要求的网络驱动程序。
网络驱动程序 | 典型用途 | 容器到容器(单节点) | 容器到外部(单节点 + 多节点) | 容器到容器(多节点) |
---|---|---|---|---|
NAT(默认) | 非常适合开发人员 | 同一子网:通过 Hyper-V 虚拟交换机桥接 跨子网:不受支持(只有一个 NAT 内部前缀) |
通过管理虚拟网络适配器路由(绑定到 WinNAT) | 不直接支持:需要通过主机公开端口 |
透明 | 非常适合开发人员或小型部署 | 同一子网:通过 Hyper-V 虚拟交换机桥接 跨子网:通过容器主机路由。 |
通过具有(物理)网络适配器直接访问权限的容器主机路由 | 通过具有(物理)网络适配器直接访问权限的容器主机路由 |
Overlay | 适用于多节点;对于 Docker Swarm 是必需的,在 Kubernetes 中可用 | 同一子网:通过 Hyper-V 虚拟交换机桥接 跨子网:网络流量通过管理虚拟网络适配器封装和路由。 |
不直接受到支持 - 需要第二个容器终结点(连接到 Windows Server 2016 上的 NAT 网络或 Windows Server 2019 上的 VFP NAT 规则)。 | 同一/跨子网:网络流量使用 VXLAN 进行封装,并通过管理虚拟网络适配器进行路由 |
L2Bridge | 用于 Kubernetes 和 Microsoft 软件设计网络 (SDN) | 同一子网:通过 Hyper-V 虚拟交换机桥接 跨子网:在入口和出口重写容器 MAC 地址并路由。 |
容器 MAC 地址 | |
在入口和出口重写 | 同一子网:桥接 跨子网:通过 WSv1809 及更高版本上的管理虚拟网络适配器路由 |
|||
L2Tunnel | 仅限 Azure | 同一/跨子网:固定到应用策略的物理主机的 Hyper-V 虚拟交换机。 | 流量必须通过 Azure 虚拟网络网关 | 同一/跨子网:固定到应用策略的物理主机的 Hyper-V 虚拟交换机 |
高级网络选项
可利用多个网络驱动程序选项来实现 Windows 特定功能和特性。 以下是一些示例:
- 通过为 Windows 容器指定多个网络适配器,访问容器主机网络的交换机嵌入式组合。
- 为网络设置 VLAN ID,以便为附加到网络的任何容器终结点配置 VLAN 隔离。
- 为网络指定 OutboundNAT 策略,以允许容器访问外界。
有关详细信息,请参阅 Windows 中的高级网络选项。