使用 Overlay 网络让 Linux 容器访问 Windows 容器

解读

在国内企业的混合云或“信创+Windows”双轨场景中,经常需要把基于 Linux 的微服务与遗留的 .NET Framework 或 IIS 服务做互联互通。Docker 的 Overlay 网络 是 Swarm 模式下唯一跨宿主、跨平台的 L2 虚拟网络,天然支持 Linux 与 Windows 容器共存。但 Windows 容器对 Overlay 的协议栈、端口、网卡及内核版本有严格限制,面试官想考察的是:

  1. 你是否清楚 Linux 与 Windows 容器在数据路径上的差异
  2. 能否给出 最小可行且可落地的配置步骤
  3. 遇到不通时,如何 用国内常见云厂商环境(阿里云、腾讯云、华为云)做排障

知识点

  1. Swarm 初始化模式:Linux 节点必须作为 manager,Windows 节点只能以 worker 加入;国内云主机需先放行 UDP 7946(Swarm 管理)UDP 4789(VXLAN)
  2. Windows 容器类型约束
    • Windows Server 2019/2022 (内核 17763+)Windows Container 支持 Overlay,Win10/11 Docker Desktop 不支持
    • 必须运行 进程隔离模式--isolation=process),Hyper-V 隔离下 vxlan 封装会被宿主机防火墙拦截。
  3. 数据路径差异:Linux 容器走 vxlan+iptables,Windows 容器走 vxlan+Host VFP 虚拟交换机;Windows 侧需要 开启 Overlay 网络驱动 并加载 Windows 的 HNS 服务
  4. MTU 与端口:国内云厂商 VPC 内网 MTU 通常为 1450,Overlay 需再减 50,设置 MTU 1400 避免分片;UDP 4789 必须放通安全组,否则 vxlan 报文被丢弃。
  5. 镜像与 DNS:Windows 容器镜像必须 基于 mcr.microsoft.com 国内加速器(如阿里云 ACR 镜像代理),否则拉取超时;Swarm 内置 DNS 要求服务名 全小写,Windows 容器对大小写敏感,需 统一命名规范

答案

步骤以 三台 ECS(杭州地域) 为例:

  1. 准备节点

    • Linux manager:CentOS 7.9,开放 7946/tcp+udp、4789/udp;
    • Linux worker:同上;
    • Windows worker:Windows Server 2019 Datacenter 17763.4252,中文市场镜像,关闭系统防火墙(或放行 4789)。
  2. 初始化 Swarm(Linux manager)

    docker swarm init --advertise-addr eth0
    docker network create -d overlay --attachable --subnet=10.10.0.0/16 demo
    
  3. Windows 节点加入
    在 Windows PowerShell 管理员模式:

    docker swarm join --token <worker-token> <manager-ip>:2377
    

    确认 docker infoSwarm: activeOS/Arch: windows/amd64

  4. 启动跨平台服务
    Linux 端:

    docker service create --name linux-svc --network demo --replicas 1 nginx:alpine
    

    Windows 端:

    docker service create --name win-svc --network demo --replicas 1 mcr.microsoft.com/dotnet/framework/samples:aspnetapp
    

    注意:Windows 镜像需提前 docker pull 并使用 阿里云 ACR 镜像加速器,否则超时。

  5. 验证互通
    进入 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" 是否启用。
  6. 生产加固

    • 使用 Docker secret 管理连接串,避免明文;
    • 在 Compose 文件里统一 MTU 1400
    • Windows 容器 以非 ContainerAdministrator 运行,通过 USER 指令降权。

拓展思考

  1. 双栈 IPv6:国内云厂商 VPC 已试点 IPv6,Overlay 可开启 --ipv6 并分配 fd00::/80,但 Windows 容器需 KB5014665 补丁 才支持 vxlan over IPv6,面试可提“先评估补丁周期”。
  2. Service Mesh 过渡:当 Windows 容器需要更细粒度熔断时,可把 Overlay 作为 L2 承载,在 Linux 侧注入 Istio 边车,Windows 容器通过 ** egress gateway ** 访问,实现“零侵入”过渡。
  3. 国产化替代:若客户要求 银河麒麟 V10 + Windows 混合部署,需验证 麒麟内核 4.19 对 vxlan offload 支持,并 用龙芯版 Docker 20.10.21 以上版本,避免旧版 Swarm 无法识别 Windows 节点的 platform=windows/amd64 元数据。