写在前面
先说一下我这边的环境: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 应用层的正确姿势
既然知道了问题所在,离线升级就明确方向了:
- 在联网机器上下载最新的
Microsoft.WSL_*.msixbundle(去 GitHub Releases 找,别去商店,商店离线包不好抓)。 - 顺带下载依赖包
Microsoft.VCLibs.140.00.UWPDesktop_*.appx(这个很多离线教程都漏了,但缺了它Add-AppxPackage会报错)。 - 拷贝到服务器,用 PowerShell 的
Add-AppxPackage安装。
关键命令:
Add-AppxPackage-Path.\Microsoft.VCLibs.140.00.UWPDesktop_xxx.appxAdd-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 上挣扎的同仁。有问题欢迎留言交流,虽然我可能不常看,但看到会回。