Win11 免 Docker 跑 Linux 容器,实测踩了三个坑

在 Windows 上跑容器,多数人绕不开 Docker Desktop:常驻托盘、崩溃之后重启要等好几秒,还得点一次权限确认弹窗。微软在最新的 WSL 预览版里塞进了 WSL Containers(命令行工具名 wslc,直接用 WSL 跑 OCI 容器,不再依赖 Docker 或 Podman),XDA 撰稿人拿它和 Docker Desktop 做了对照实测,结论是开发场景可以换,长期常驻的家庭服务器还不行。

差异出在架构:Docker Desktop 的引擎跑在 WSL 共享虚拟机里,wslc 则每启一个容器就单独建一台私有虚拟机。好处是每次启动环境完全一致,坏处是内存和管理方式都得重新适应。

一、开启只要一条命令

  1. 执行 wsl --update --pre-release 升级到预览版,wslc 命令随之可用。
  2. 先记住收尾命令 wslc system session terminate,原因见下一节。

二、先学会清残留虚拟机

  1. Docker Desktop 空载时含特权 Windows 服务一起算,占用不到 200 MB 内存;而跑一个 wslc 容器会新建一台以用户名命名的虚拟机,吃掉约 1.5 GB。
  2. 微软称容器用完即消失——容器确实消失了,但托着内存的虚拟机不会,手动执行 WSL 关机也杀不掉。唯一解法是 wslc system session terminate,这条命令藏在三层子命令之下,wslc 自己也不会提示。
  3. 更费内存的是连带效应:启动一个 wslc 容器会同时唤起一份全新的 WSL 共享虚拟机,并把已装的 Ubuntu 重新标记为运行中,一个空闲的命令行提示符合计吃掉 3.4 GB 内存。

三、速度实测:差距小到感觉不到

  1. 早期报道称 wslc 启动容器不到一秒,Docker Desktop 要三到八秒。用 alpine 镜像配合计时脚本冷热各跑一轮,结果是热启动 wslc 357 至 384 毫秒、Docker Desktop 426 至 463 毫秒;冷启动(会话已终止或应用已退出)wslc 2387 至 2611 毫秒、Docker Desktop 2629 至 2973 毫秒。
  2. 只有 Docker 非正常退出才拉开差距:强制结束进程后冷启动要 6667 毫秒,连辅助进程一起杀掉则是 9108 毫秒,其中包含一次权限确认弹窗。
  3. 真正的优势是稳定:六次 wslc 启动全部落在 224 毫秒区间内,因为私有虚拟机不继承任何状态,无论怎么被强行拆掉都没有残留需要修复。

四、显卡能用,端口有坑

  1. GPU 加速开箱可用:一个标准的 CUDA 12.4 镜像立刻认出 RTX 5090,只需加 --gpus-all 参数,不必在容器里折腾驱动,宿主机装 CUDA 13.3 驱动同样正常。注意这是显卡半虚拟化而非独占直通,显存和 Windows 桌面共用,规划时要留余量。
  2. 网络默认绑定 127.0.0.1,而不是 Docker 习惯的 0.0.0.0。测试 nginx 时必须显式发布到 0.0.0.0 才通,且会弹出一条归属于 COM Surrogate 的防火墙提示——正是很多人误当成病毒的那种弹窗。

五、Compose 目前靠社区补丁

  1. 截至 2.9.3 版本,wslc compose 仍然不可用。社区项目 wslc-compose 用一层轻量 Python 转译补上了这个缺口,通过 pipx(Python 命令行工具的隔离安装器)装好即可。
  2. 实测拿 nginx 加 Postgres 两个服务、配置里写上依赖顺序,结果正常跑通:生成项目独立网络、数据库先于 Web 容器启动、两容器共用去重后的 Alpine 基础层,down -v 也能连网络一起清干净。

注意事项

  1. 参数还不全:没有特权模式、设备直通和重启策略,会话一断里面的东西全没,常驻服务不适合搬过来。
  2. 可见性是短板:Docker 的容器摆在图形界面里,wslc 得靠命令行才能看清有什么在跑,目前还没有对应的管理界面。

来源:XDA Developers