WSL Containers现已在Windows上正式发布,微软已开始开发Compose Microsoft已将WSL Containers移出公开预览阶段。现在,任何运行wsl –update的用户都可以正式使用它。在9月29日的公告中,Windows平台与开发者事业部公司副总裁Logan Iyer确认,最新版本的WSL包含wslc.exe和WSL Containers API。
此前,想使用Linux容器的Windows开发者通常会安装Docker Desktop,或手动在WSL发行版中配置Docker Engine。WSL Containers则将Microsoft的容器工作流直接引入WSL。
将WSL更新到3.0.1版本以获得正式版Containers。图片来源:Windows Latest我们在7月对仍处于预览阶段的WSL Containers进行了测试,构建了一个自定义Linux容器,通过它运行Flask应用,并从Windows端通过localhost访问。整个过程运行良好。
在WSL容器中运行uname -a可确认其使用的是真正的Linux内核,而非转换层不过,这并不是WSL 3。Microsoft在今年早些时候已经平息了有关WSL 3的传闻,尽管颇为巧合的是,GitHub上的正式版构建名称确实是WSL 3.0.1。
第一部分是wslc.exe,这是一个可以在Windows中构建、运行、管理和部署Linux容器的命令行工具。Microsoft还提供了作为别名的container.exe,熟悉Docker的用户会很容易上手。
wslc run –rm -it ubuntu:latest
wslc image ls

第二部分是WSL Containers API,它允许原生Windows应用通过代码创建和控制Linux容器。该API包含在Microsoft.WSL.Containers NuGet包中,提供C#和C++/WinRT投影,并支持标准输入和标准输出、文件挂载、网络以及GPU访问。
负责WSL的Microsoft首席产品经理Craig Loewen在X上解释了正式发布的实际含义。他写道:“它现在已经结束预览阶段,进入‘所有人都能获得的WSL版本’,可以用于完整的开发和生产场景。”
不过,“原生”并不意味着这些容器运行在Windows内核上。它们运行在WSL虚拟机基础设施中的Linux内核上。
Linux容器中的Flask服务器可通过Windows上的localhost访问,无需额外配置网络Microsoft高级软件工程师Pierre Boulay于9月29日发布了一篇关于WSL Containers的架构深度解析。
在常规WSL中,应用会与wslservice.exe通信。该程序是一个负责创建虚拟机的特权Windows服务。对于WSL Containers,该服务不会继续拥有虚拟机,而是创建一个名为wslcsession.exe的子进程。该进程代表用户运行,负责创建容器、挂载目录和绑定网络端口。
wslc架构。来源:MicrosoftMicrosoft表示,这种设计为每个会话提供了更强的隔离性,因为各个会话运行在独立进程中;同时也提升了安全性,因为会话操作所需的权限少于wslservice.exe。
每个会话都会获得一个独立的VHD,存储在%AppData%\Local\wslc\sessions下。容器可以通过卷挂载使用Windows文件夹,Microsoft会通过virtiofs将这些文件夹共享到虚拟机中。Boulay表示:“与plan9相比,virtiofs的速度大约快一倍。”常规WSL发行版此前一直使用plan9访问C盘。需要原生Linux文件系统或大小限制的容器,则可以使用由VHD支持的卷。
wslc存储。来源:Microsoft正式版新增了wslc container restart容器重启功能、使用cp复制文件的功能、wslc network connect和disconnect、wslc network create的额外驱动选项、容器运行状况检查,以及wslc create和wslc run中的–mount支持。
wslc显示完整命令列表。图片来源:Windows Latest网络方面的变化更为有趣。在Consommé模型下,Linux虚拟机的所有流量都会以以太网帧的形式进入virtio队列;一个以用户身份运行的Windows进程负责响应DNS查询、路由TCP和UDP流量,并处理端口映射。
由于流量离开虚拟机时看起来就像由普通Windows进程发出的一样,Microsoft表示,它与VPN和防火墙的兼容性大幅提升,而这两者多年来一直是WSL用户头疼的问题。在我们7月的测试中,容器中的Flask服务无需额外配置网络,就能从Windows通过127.0.0.1:5000访问。
wslc网络。来源:MicrosoftIT管理员需要注意,正式版发布后,Microsoft Intune可以启用或禁用WSL Containers,并将镜像拉取限制在获批准的注册表列表中。
Microsoft Defender for Endpoint现有的WSL集成现在也覆盖容器,可以显示容器内部的进程、文件和网络活动,并将其关联回Windows主机。

我们此前对预览版的报道发现,Microsoft正通过组策略、注册表允许列表和Defender构建这套功能,正式版确认这些组件已经就绪。Loewen在一段短视频中表示,该功能已与Intune以及Microsoft Defender for Endpoint实现全面集成,为企业环境提供所需的安全控制。
Microsoft的正式版公告称,VS Code Dev Containers扩展可以使用wslc作为容器驱动程序,VS Code Containers扩展和Aspire也支持它。
当一名用户向Loewen询问VS Code配置指南时,他表示:“应该只需在设置中将‘wslc’设为所选二进制文件即可。”随后,该用户Neil Enns报告称,即使将扩展从预发布版切换到正式版,Dev Containers仍提示找不到“docker”命令。因此,这项集成已经上线,但编辑器配置可能仍需要一些排查。
Microsoft表示:“WSLc最受欢迎的功能请求是加入Compose支持,这将是我们下一阶段迭代的重点。”
Compose允许开发者在一个compose.yaml文件中描述多个相关容器,例如Web前端、后端API、数据库和缓存,并通过一条命令启动整个技术栈。在我们7月的测试中,由于缺少Compose,多容器项目中的每个容器都必须逐一启动。
Microsoft的目标是让“wsl compose up可以直接使用现有的compose.yaml文件,无需任何修改”。Loewen也在X上确认,这项功能已经列入路线图。Compose相关工作也记录在GitHub issue中。
当一名开发者询问wslc能否在WSL发行版内部构建并推送镜像时,Loewen提到了由他编写的社区仓库wslc-remote。Microsoft希望原生支持这一功能,但他表示其中存在“很多棘手的边缘情况”,因此目前仍作为社区项目提供,实际效果可能因人而异。
另一名用户表示,由于缺少–privileged支持,他们不得不回到Docker,以运行kind和k3d Kubernetes集群。Loewen回应称该功能即将推出,并且由于已经进入主分支,应该很快就会进入预览阶段。
需要记住的是,正式发布并不意味着wslc在所有功能上都能与成熟的容器平台完全匹敌。
正如我们此前报道的那样,Windows 10仍在为开发者获得WSL功能。Loewen在7月表示,WSL Containers“目前可以运行在所有支持WSL的环境中”,我们也曾在Windows 10上运行wslc,构建并提供Flask仪表板。
Windows 10中的WSL Container。图片来源:Windows Latest在X上,当有人询问WSL Containers是否支持在Windows Server生产环境中使用时,Loewen回答:“是的,它支持生产环境!”
具有讽刺意味的是,多年前Steve Ballmer曾臭名昭著地称Linux为“癌症”,而如今Microsoft几乎要把Windows 11变成一流的Linux容器主机。此前Microsoft推出自有免费Linux发行版时,我们已经看到了这一趋势;如今又将容器工具加入WSL,无疑进一步巩固了这一方向。Microsoft已经意识到,没有Linux,Windows无法继续发展。
WSL现在已经开源,Microsoft持续改进Windows与Linux之间的文件访问和网络功能。借助WSL Containers API,Windows应用可以运行Linux容器,而用户甚至不必意识到其中涉及Linux。

Microsoft的正式版公告称,Windows上的Linux正在超越开发环境,成为运行AI和云原生工作负载的平台。Google正为其新的AI工具带来原生Windows 11和WSL支持,而Ubuntu在Windows 11上的增长速度也快于原生Linux PC,因此WSL正日益成为Windows开发者与Linux工具链之间的桥梁。
是的,WSL Containers已经不再只是一个有趣的预览功能。运行一次wsl –update,开发者就能获得用于Linux容器的官方CLI和API,管理员则可以使用Intune和Defender进行控制。
不过,我不认为大多数用户能如此迅速地摆脱Docker Desktop。Compose仍在路线图中,一些高级场景仍然需要Docker,第三方工具也很重要。我最期待的是wsl compose up,因为当它能够不加修改地运行现有Compose文件时,许多开发者就终于可以卸载Docker Desktop了。