写在前面

先说一下我这边的环境:Windows Server 2022,标准版,物理机,纯内网环境,跟互联网物理隔离。需要跑 Docker Desktop,自然绕不开 WSL 2 后端。

按理说,Windows Server 2022 官方宣称支持 WSL,文档写得也挺明白。但真上手才发现,网上的教程大多针对 Windows 11 / 10 消费者版,Server 版很多细节完全对不上号。尤其是离线部署,坑一个接一个。

这篇不是教程的复读机,把我从“装上了但用不了”到“彻底跑通”的过程记下来,给同样在 Server 上折腾 WSL 的同行省点时间。
在这里插入图片描述


相关资源:
Microsoft.WSL-2.7.12.0-x64-ARM64:https://download.csdn.net/download/u012551928/93296515


第一回合:装上了 Ubuntu,但 wsl 命令不认

一开始我用 .appx 包离线装了 Ubuntu 22.04,双击安装包一路 Next,看起来一切顺利。开始菜单里也有 Ubuntu 的图标了,点开也确实能初始化,创建 root 用户,进到 bash 里边。

但奇怪的是,在 PowerShell 里敲 wsl --list --verbose,能看到 Ubuntu 状态是 Running,版本是 2。可敲 ubuntu 命令,直接报“不是内部或外部命令”。再敲 wsl --version,直接报“命令行选项无效”。

这时候我才意识到:Server 自带的 wsl.exe 是个古董版本,很多新命令参数根本不支持。Ubuntu 发行版虽然装上了,但底层的 WSL 组件还是系统自带的老掉牙版本。

网上很多人说“装个内核更新包 wsl_update_x64.msi 就行”,我试了,装完后 wsl --list --verbose 还能用,但 --version 依然不支持。Docker Desktop 一启动,照样弹框说 WSL too old。


第二回合:搞明白 Docker Desktop 到底在检查什么

仔细看了 Docker 的报错信息,它说的是“Your version of Windows Subsystem for Linux (WSL) is too old.”,然后建议执行 wsl --update。

问题在于,离线服务器没法执行 --update(这个命令默认去 Microsoft Store 在线下载)。而即便手动装了 wsl_update_x64.msi,Docker 依然不认。

后来翻了微软的官方文档,才发现 WSL 的组件其实分两层:

  • 内核层:wsl_update_x64.msi 负责更新 Linux 内核,这个装了之后 wsl --list --verbose 能正常显示版本号。
  • 应用层:wsl.exe 本身是 UWP 应用,需要通过 .msixbundle 包升级。Docker Desktop 检查的是应用层版本,要求至少 2.1.5 以上。

Server 2022 自带的 wsl.exe 版本号大概是 1.x,根本不认识 --version 参数。所以即使内核更新了,应用层没变,Docker 照样认为你“太老”。


第三回合:离线升级 WSL 应用层的正确姿势

既然知道了问题所在,离线升级就明确方向了:

  1. 在联网机器上下载最新的 Microsoft.WSL_*.msixbundle(去 GitHub Releases 找,别去商店,商店离线包不好抓)。
  2. 顺带下载依赖包 Microsoft.VCLibs.140.00.UWPDesktop_*.appx(这个很多离线教程都漏了,但缺了它 Add-AppxPackage 会报错)。
  3. 拷贝到服务器,用 PowerShell 的 Add-AppxPackage 安装。

关键命令:

Add-AppxPackage -Path .\Microsoft.VCLibs.140.00.UWPDesktop_xxx.appx
Add-AppxPackage -Path .\Microsoft.WSL_xxx.msixbundle

装完之后必须重启(光注销不够,我试过重启 wsl --shutdown 没用,必须重启系统,否则 PATH 里还是旧版 wsl.exe)。

重启后,再开 PowerShell,wsl --version 终于能正常输出版本号了。Docker Desktop 再启动,那个弹框消失,顺利进到主界面。


几个容易踩的细节

  • 版本号对应关系:Docker Desktop 要求 WSL 应用版本 ≥ 2.1.5,而 Server 自带的是 1.x,所以必须升应用层,不是只升内核。
  • 依赖包别漏:VCLibs 不装的话,Add-AppxPackage 会报 0x80073CF3,提示“包无法进行更新、相关性或冲突验证”。这个依赖包在 WSL GitHub Release 页的 Assets 里通常也会提供,留意一下。
  • 关于 --version 参数:如果你的 wsl.exe 不认识这个参数,说明应用层就是旧版,升 .msixbundle 是唯一解。
  • Server 版没有 Microsoft Store:所以不要试图用 wsl --install 或 wsl --update,这些命令在 Server 上要么报错,要么去连商店(连不上)。老老实实离线包。

最终状态

现在服务器上 WSL 应用版本是 2.3.1.0,Ubuntu 22.04 作为默认发行版,Docker Desktop 正常运行,能拉镜像、起容器。整个过程比预期曲折,但搞明白原理之后其实也就那几步。


一点心得

Windows Server 上的 WSL 其实是个“半成品”状态——功能都有,但包管理、更新机制跟桌面版割裂。微软官方文档重点放在 Windows 10/11,Server 的离线部署案例少得可怜。如果你也遇到类似问题,别迷信 wsl_update_x64.msi,那个只管内核,真正要升级的是 wsl.exe 本体。

另外,如果你只是临时要用 Docker,也可以考虑切 Hyper-V 后端,但那样容器的文件系统性能不如 WSL 2,而且网络配置更麻烦。既然 WSL 2 能跑通,还是建议走这条路。


希望这篇能帮到正在离线 Server 上挣扎的同仁。有问题欢迎留言交流,虽然我可能不常看,但看到会回。

更多推荐