使用 Overlay 网络让 Linux 容器访问 Windows 容器
解读
在国内企业的混合云或“信创+Windows”双轨场景中,经常需要把基于 Linux 的微服务与遗留的 .NET Framework 或 IIS 服务做互联互通。Docker 的 Overlay 网络 是 Swarm 模式下唯一跨宿主、跨平台的 L2 虚拟网络,天然支持 Linux 与 Windows 容器共存。但 Windows 容器对 Overlay 的协议栈、端口、网卡及内核版本有严格限制,面试官想考察的是:
- 你是否清楚 Linux 与 Windows 容器在数据路径上的差异;
- 能否给出 最小可行且可落地的配置步骤;
- 遇到不通时,如何 用国内常见云厂商环境(阿里云、腾讯云、华为云)做排障。
知识点
- Swarm 初始化模式:Linux 节点必须作为 manager,Windows 节点只能以 worker 加入;国内云主机需先放行 UDP 7946(Swarm 管理) 与 UDP 4789(VXLAN)。
- Windows 容器类型约束:
- 仅 Windows Server 2019/2022 (内核 17763+) 的 Windows Container 支持 Overlay,Win10/11 Docker Desktop 不支持;
- 必须运行 进程隔离模式(
--isolation=process),Hyper-V 隔离下 vxlan 封装会被宿主机防火墙拦截。
- 数据路径差异:Linux 容器走 vxlan+iptables,Windows 容器走 vxlan+Host VFP 虚拟交换机;Windows 侧需要 开启 Overlay 网络驱动 并加载 Windows 的 HNS 服务。
- MTU 与端口:国内云厂商 VPC 内网 MTU 通常为 1450,Overlay 需再减 50,设置 MTU 1400 避免分片;UDP 4789 必须放通安全组,否则 vxlan 报文被丢弃。
- 镜像与 DNS:Windows 容器镜像必须 基于 mcr.microsoft.com 国内加速器(如阿里云 ACR 镜像代理),否则拉取超时;Swarm 内置 DNS 要求服务名 全小写,Windows 容器对大小写敏感,需 统一命名规范。
答案
步骤以 三台 ECS(杭州地域) 为例:
-
准备节点
- Linux manager:CentOS 7.9,开放 7946/tcp+udp、4789/udp;
- Linux worker:同上;
- Windows worker:Windows Server 2019 Datacenter 17763.4252,中文市场镜像,关闭系统防火墙(或放行 4789)。
-
初始化 Swarm(Linux manager)
docker swarm init --advertise-addr eth0 docker network create -d overlay --attachable --subnet=10.10.0.0/16 demo -
Windows 节点加入
在 Windows PowerShell 管理员模式:docker swarm join --token <worker-token> <manager-ip>:2377确认
docker info中Swarm: active且OS/Arch: windows/amd64。 -
启动跨平台服务
Linux 端:docker service create --name linux-svc --network demo --replicas 1 nginx:alpineWindows 端:
docker service create --name win-svc --network demo --replicas 1 mcr.microsoft.com/dotnet/framework/samples:aspnetapp注意:Windows 镜像需提前
docker pull并使用 阿里云 ACR 镜像加速器,否则超时。 -
验证互通
进入 Linux 容器:docker exec -it <linux-svc>.1.xxx sh ping win-svc curl http://win-svc:80进入 Windows 容器:
docker exec -it <win-svc>.1.xxx powershell Test-NetConnection linux-svc -Port 80若出现 Destination host unreachable,优先检查:
- 安全组是否放通 UDP 4789;
- Windows 宿主机
Get-HNSNetwork是否已生成 类型为 Overlay 的 l2bridge; Get-NetFirewallRule -DisplayName "Docker Swarm"是否启用。
-
生产加固
- 使用 Docker secret 管理连接串,避免明文;
- 在 Compose 文件里统一 MTU 1400;
- Windows 容器 以非 ContainerAdministrator 运行,通过
USER指令降权。
拓展思考
- 双栈 IPv6:国内云厂商 VPC 已试点 IPv6,Overlay 可开启
--ipv6并分配 fd00::/80,但 Windows 容器需 KB5014665 补丁 才支持 vxlan over IPv6,面试可提“先评估补丁周期”。 - Service Mesh 过渡:当 Windows 容器需要更细粒度熔断时,可把 Overlay 作为 L2 承载,在 Linux 侧注入 Istio 边车,Windows 容器通过 ** egress gateway ** 访问,实现“零侵入”过渡。
- 国产化替代:若客户要求 银河麒麟 V10 + Windows 混合部署,需验证 麒麟内核 4.19 对 vxlan offload 支持,并 用龙芯版 Docker 20.10.21 以上版本,避免旧版 Swarm 无法识别 Windows 节点的
platform=windows/amd64元数据。