如何在同一台主机共存 LCOW 与 WCOW 容器

解读

面试官问的是“同一台 Windows 宿主机上,既要跑 Linux 容器(LCOW)又要跑 Windows 容器(WCOW),怎么实现?”
国内主流场景是 Windows Server 2019/2022 数据中心版,跑在物理机或 VMware/Hyper-V 虚拟化上,既要兼容老旧的 .NET Framework 服务(WCOW),又要跑新写的 Spring Cloud 或 Python 服务(LCOW)。
核心矛盾是:Windows 宿主机内核只能同时加载一个容器运行时隔离模式(进程隔离 vs Hyper-V 隔离),而 Linux 容器需要额外的轻量虚拟机(LinuxKit)来承载。
回答必须给出可落地的配置步骤、版本限制、性能损耗评估与故障排查思路,否则会被认为“纸上谈兵”。

知识点

  1. 容器隔离模式
    • WCOW 支持进程隔离(--isolation=process)与 Hyper-V 隔离(--isolation=hyperv)。
    • LCOW 强制使用 Hyper-V 隔离,每个 Linux 容器跑在轻量 VM 里。
  2. 运行时切换
    • Windows Docker Engine 通过 “切换守护进程模式” 实现 LCOW/WCOW 共存,而非像 Linux 那样用 context 直接切换。
  3. 国内常见坑
    • 中文版 Windows 镜像名称带中文标签,导致 docker pull 失败,需 --platform=linux/windows 显式指定。
    • 国内网络拉取 mcr.microsoft.com 超时,需配置 阿里云/腾讯云加速器 并给 daemon.json 加 "registry-mirrors"
  4. 资源争抢
    • LCOW 的 Hyper-V 分区会吃掉额外 200~400 MB 内存,生产环境必须预留 2 GB 以上内存给宿主机
  5. 版本矩阵
    • Windows Server 2019 1809/Windows 10 1903 以上才支持 LCOW GA;低于此版本只能实验性预览,面试官会直接判负。

答案

步骤如下,按顺序执行,任何一步报错都要回滚并检查事件日志,否则容器会卡在“CreateComputeSystem”:

  1. 宿主机准备
    安装 Windows Server 2019/2022 数据中心版(Build 17763+),启用容器功能与 Hyper-V:

    Enable-WindowsOptionalFeature -Online -FeatureName Containers -All
    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
    

    重启后确认 Get-WindowsFeature | Where Name -like "*Containers*" 为已安装。

  2. 安装 Docker Engine 20.10+(国内源)
    使用阿里云的 docker-ee-windows.zip 离线包或腾讯云的镜像脚本,版本必须 ≥ 20.10,否则 LCOW 支持不完整。
    安装完成后,把 daemon.json 放在 C:\ProgramData\Docker\config\daemon.json

    {
      "experimental": true,
      "registry-mirrors": ["https://mirror.ccs.tencentyun.com"],
      "allow-nondistributable-artifacts": ["registry.cn-hangzhou.aliyuncs.com"]
    }
    

    重启 Docker 服务:Restart-Service docker

  3. 启用 LCOW 支持
    PowerShell 管理员下执行:

    [Environment]::SetEnvironmentVariable("LCOW_SUPPORTED", "1", "Machine")
    

    然后运行:

    docker run --rm --platform=linux --name=test-alpine alpine:latest uname -a
    

    若能打印 Linux 5.10.x-microsoft-standard-WSL2,说明 LCOW 已就绪。

  4. 拉取并运行 WCOW 容器
    不切换模式,直接:

    docker run --rm --platform=windows --name=test-win mcr.microsoft.com/windows/servercore:ltsc2019 cmd /c ver
    

    若输出 Microsoft Windows [Version 10.0.17763.xxxx],WCOW 正常。

  5. 共存验证
    开两个 PowerShell 窗口,一个 docker run -d --platform=linux nginx:alpine,另一个 docker run -d --platform=windows mcr.microsoft.com/dotnet/framework:4.8-windowsservercore-ltsc2019
    然后 docker ps 应同时看到 Linux 容器与 Windows 容器,且 Get-VM 能看到名为 docker-desktop- 的轻量虚拟机*(LCOW 使用)。

  6. 性能调优

    • 给 Hyper-V 预留 2 个物理 CPU 核心,防止 LCOW 容器 CPU 饥饿。
    • 在 daemon.json 加 "storage-opts": ["size=50GB"],限制 WCOW 镜像膨胀。
    • 使用 多阶段构建 把 Windows 镜像压到 1 GB 以内,减少同时启动时的磁盘 IO 争抢。
  7. 故障排查
    若出现 “Failed to create compute system: The virtual machine could not be started because a required feature is not installed”
    检查 BIOS 是否开启 Intel VT-x/AMD-V 与 SLAT
    docker pull“unauthorized: authentication required”,则是国内镜像加速器没配置白名单,需把 mcr.microsoft.com 加入 --allow-nondistributable-artifacts

拓展思考

  1. 生产环境是否值得混部?
    建议按业务域拆分节点

    • 计算密集型 Linux 微服务统一跑在 Kubernetes + containerd 的 Linux 节点池;
    • 老旧 Windows 服务跑在单独的 Windows 节点池,用 taint/toleration 隔离。
      混部只用于开发测试,降低 CI/CD 流水线复杂度。
  2. 镜像安全加固
    WCOW 镜像默认带 powershell.exe,需用 dockerfile 里 RUN del /F /Q C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe 删除,再转非 root 用户(虽然 Windows 没有 root 概念,但需建低权限用户)。
    LCOW 镜像用 distroless 或 alpine-minimal,并把 /etc/apk/repositories 换成国内清华源,减少 CVE 暴露面。

  3. 未来趋势
    微软已宣布 LCOW 停止演进,全面转向 WSL2 容器
    下一版本 Windows Server 2025 将支持 “WSL2 容器”作为一等公民,届时同一宿主机跑 Linux 容器不再需要 Hyper-V 隔离,性能可提升 30% 以上
    面试时可以补充:“如果后续升级到 Windows Server 2025 预览版,我会用 wsl --install --container-type=linux 替代 LCOW,进一步降低 overhead。” 这会让面试官感受到你对社区 Roadmap 的敏感度。