如何在同一台主机共存 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)来承载。
回答必须给出可落地的配置步骤、版本限制、性能损耗评估与故障排查思路,否则会被认为“纸上谈兵”。
知识点
- 容器隔离模式:
- WCOW 支持进程隔离(--isolation=process)与 Hyper-V 隔离(--isolation=hyperv)。
- LCOW 强制使用 Hyper-V 隔离,每个 Linux 容器跑在轻量 VM 里。
- 运行时切换:
- Windows Docker Engine 通过 “切换守护进程模式” 实现 LCOW/WCOW 共存,而非像 Linux 那样用 context 直接切换。
- 国内常见坑:
- 中文版 Windows 镜像名称带中文标签,导致 docker pull 失败,需 --platform=linux/windows 显式指定。
- 国内网络拉取 mcr.microsoft.com 超时,需配置 阿里云/腾讯云加速器 并给 daemon.json 加
"registry-mirrors"。
- 资源争抢:
- LCOW 的 Hyper-V 分区会吃掉额外 200~400 MB 内存,生产环境必须预留 2 GB 以上内存给宿主机。
- 版本矩阵:
- Windows Server 2019 1809/Windows 10 1903 以上才支持 LCOW GA;低于此版本只能实验性预览,面试官会直接判负。
答案
步骤如下,按顺序执行,任何一步报错都要回滚并检查事件日志,否则容器会卡在“CreateComputeSystem”:
-
宿主机准备
安装 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*"为已安装。 -
安装 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。 -
启用 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 已就绪。
-
拉取并运行 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 正常。
-
共存验证
开两个 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 使用)。 -
性能调优
- 给 Hyper-V 预留 2 个物理 CPU 核心,防止 LCOW 容器 CPU 饥饿。
- 在 daemon.json 加
"storage-opts": ["size=50GB"],限制 WCOW 镜像膨胀。 - 使用 多阶段构建 把 Windows 镜像压到 1 GB 以内,减少同时启动时的磁盘 IO 争抢。
-
故障排查
若出现 “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。
拓展思考
-
生产环境是否值得混部?
建议按业务域拆分节点:- 计算密集型 Linux 微服务统一跑在 Kubernetes + containerd 的 Linux 节点池;
- 老旧 Windows 服务跑在单独的 Windows 节点池,用 taint/toleration 隔离。
混部只用于开发测试,降低 CI/CD 流水线复杂度。
-
镜像安全加固
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 暴露面。 -
未来趋势
微软已宣布 LCOW 停止演进,全面转向 WSL2 容器。
下一版本 Windows Server 2025 将支持 “WSL2 容器”作为一等公民,届时同一宿主机跑 Linux 容器不再需要 Hyper-V 隔离,性能可提升 30% 以上。
面试时可以补充:“如果后续升级到 Windows Server 2025 预览版,我会用 wsl --install --container-type=linux 替代 LCOW,进一步降低 overhead。” 这会让面试官感受到你对社区 Roadmap 的敏感度。