
这个问题我印象太深了。前阵子帮同事收拾一台新笔记本Win11 系统Docker Desktop 装得很顺利结果双击启动图标右下角弹了个提示框WSL needs updating后面还挂着一大串英文大意是当前 Windows Subsystem for Linux 版本太老至少需要 2.0.0.0 或更高然后一行小字Run:wsl --update。当时第一反应是这什么情况刚买的电脑、刚装的系统WSL 怎么还能太老后来把整条链路捋清楚才发现这就是 WSL 内核版本的问题——老版本 WSL 自带的内核还停在5.10而新版 Docker Desktop 要求内核至少5.15检测不通过就直接罢工。这篇文章就把完整解决方案从头到尾盘一遍包括一条命令升级、手动装内核包兜底以及升级之后各种反复报错的排查思路给卡在这个弹窗上的朋友做个参考。1. 为什么 Docker Desktop 非要管 WSL 的内核版本1.1 WSL 2 不是翻译层而是藏在 Windows 里的轻量虚拟机很多人以为 WSL 就是个兼容层把 Linux 的系统调用翻译成 Windows 的跑点命令行工具而已。那是 WSL 1 时代的思路。从 WSL 2 开始微软换了个做法在 Hyper-V 虚拟化层上跑一个完整的、微软定制的 Linux 内核然后在这个内核上启动你装的 Ubuntu、Debian 这些发行版。换句话说WSL 2 本质上是一个轻量级虚拟机。这个区别很关键。WSL 2 不再依赖翻译来模拟 Linux而是让 Linux 代码直接在真正的 Linux 内核上跑所以兼容性大幅提升。Docker 容器依赖的很多内核能力——cgroup、namespace、overlayfs——在翻译层里模拟起来又慢又容易出错在真实内核上就是原生操作。而 Docker Desktop 在 Windows 上的架构恰好就是围绕这个内核设计的。它没有自己单独维护一套 Linux 内核而是直接复用 WSL 2 的。你在 Windows 里跑 Linux 容器底层其实是在 WSL 2 的那个轻量虚拟机里跑的。所以 Docker Desktop 对 WSL 内核的版本有要求本质上就是你的地基版本太老我的一些功能用不了那我不如先拦住你。1.2 Docker Desktop 的两条后端路线Docker Desktop 从一开始在 Windows 上就有两套后端可选Hyper-V 后端独立创建一个 Hyper-V 虚拟机里面装一个完整的 Linux 发行版Docker 引擎跑在里面。这个方案资源开销大启动慢而且和用户当前打开的终端不在同一个环境里体验比较割裂。WSL 2 后端直接利用 WSL 2 的轻量 VM 来运行 Docker 引擎。启动快、内存占用小而且你打开 Ubuntu 终端docker 命令就在手边开发体验连续很多。现在默认推荐、也默认开启的是 WSL 2 后端。如果你在 Docker Desktop 的设置里看到 Use the WSL 2 based engine 是勾选状态那你的 Docker 引擎就是挂在 WSL 2 内核上的。于是问题就来了Docker Desktop 启动时会先做一次环境健康检查把它需要的内核特性、版本一一核对。一旦发现 WSL 组件版本低于预设阈值那就直接弹 WSL needs updating根本不给你继续初始化的机会。1.3 它到底在检测哪个版本这个坑很多人没分清我在排查的时候发现很多人把WSL 组件版本、内核版本、发行版版本混为一谈。这三个虽然都带版本两个字但完全是三个东西检测对象查看方式报错前常见的值WSL 组件版本wsl --version输出里的第一行1.2.5.0老Linux 内核版本在 WSL 发行版里执行uname -r5.10.102.1-microsoft-standard-WSL2发行版版本lsb_release -a或/etc/os-releaseUbuntu 22.04、Debian 12Docker Desktop 的检测逻辑虽然在不同版本上略有差异但宏观上可以理解为它要求 WSL 整个组件的版本达到 2.0.0.0 以上对应的内核基线就是 5.15 起步。所以你会看到标题里强调内核 5.10 升级到 5.15方向非常明确我们要动的是 WSL 组件以及它内置的内核而不是去把 Ubuntu 18.04 升级到 22.04。后者是发行版用户空间的升级和这个报错没有直接关系。弄清这一点之后整个解决思路就清晰了升级 WSL 组件到 2.0.0.0内核自然跟着变成 5.15然后让 Docker Desktop 重新初始化。2. 动手前先摸清家底三条命令定位问题层级2.1 先查 WSL 组件版本号打开 PowerShell普通权限就行输入wsl --version如果你之前没有手动初始化过 WSL系统可能会提示Windows Subsystem for Linux has no installed distributions意思是还没装任何发行版。如果已经正常装过你会看到类似这样一段输出WSL 版本 2.0.0.0 内核版本 5.15.90.1 WSLg 版本 1.0.51 MSRDC 版本 1.0.34 Direct3D 版本 1.606.4 DXCore 版本 10.0.25131.1002 Windows 版本 10.0.22621.1555这段信息非常有价值。我建议你把WSL 版本和内核版本这两行单独记下来。报 WSL needs updating 的机器第一行通常还在 1.x 或者 2.0 之前的过渡版本内核版本那一行大概率写着 5.10 开头。2.2 再进发行版查内核拿到最直观的证据光看 WSL 组件版本还不够我还习惯进发行版里再确认一下内核。打开 Ubuntu 或其他发行版终端执行uname -r你会看到类似5.10.102.1-microsoft-standard-WSL2这个5.10就是报错里说的老内核的铁证。在正常情况下微软随新版 WSL 分发的是 5.15 甚至 6.x 内核输出会变成5.15.90.1-microsoft-standard-WSL2这种格式。顺便提一句microsoft-standard-WSL2这个后缀说明你现在跑的就是 WSL 2 内核。如果你看到的是类似4.19.128-microsoft-standard不带 WSL2 后缀那说明正在运行的是 WSL 1Docker Desktop 同样会有问题。这种情况需要先用wsl --set-version 发行版名 2切到 WSL 2。2.3 最后确认系统版本和相关服务这一步很多人会跳过但如果你升级过程中莫名其妙失败十有八九是系统环境不配合。先按Win R输入winver回车看系统大版本。处理这个报错我建议系统至少是 Windows 10 21H2 以上Win11 的话基本都在支持范围内。用 Windows 10 的 1909、2004 这些年代久远的版本WSL 2 组件更新会被系统能力直接卡住即便强行装上了后面的体验也很糟糕。再检查 Windows Update 服务是否被禁用了。运行services.msc找到Windows Update (wuauserv)和Background Intelligent Transfer Service (BITS)确认这两个服务没有被改成禁用。很多公司电脑为了防自动更新会用脚本关掉这两个服务结果wsl --update拉包就失败了。这不影响你手动装 MSI但对于命令升级方案是致命伤。一句话总结定位思路wsl --version看组件、uname -r看内核、winver看系统三个都对上了才能判断修复方向。3. 主方案wsl --update一条命令把内核升上来3.1 以管理员身份打开 PowerShell这是整个操作里最容易忽略的一步。很多人直接在普通 PowerShell 窗口里敲命令结果要么提示访问拒绝要么命令静默失效。正确姿势右键点击开始菜单选终端(管理员)或Windows PowerShell(管理员)在弹出的 UAC 提示里选是。这一步确认后你的窗口标题栏会显示管理员: Windows PowerShell。3.2 执行更新命令实际上是两条进入管理员 Shell 后先试最常规的命令wsl --update这条命令会连接微软的更新通道检查当前 WSL 组件然后拉取最新版本并安装。正常情况下你会在窗口里看到进度条和下载百分比慢的话等上一两分钟。如果你的网络环境比较特殊——公司代理、防火墙策略、或者微软商店分发通道被卡住——第一次执行可能会卡在 0% 或者提示下载失败。这时候换带参数的版本wsl --update --web-download--web-download的意思是绕过 Microsoft Store 的分发路径直接从微软 CDN 和 GitHub 上的发布通道拉取安装包。实测下来在内网和代理环境里这个参数的成功率比默认要高很多。我自己的经验是默认 update 失败的机器换 web-download 大概率能一把过。3.3 更新完成不等于生效必须重启 WSL更新命令执行完终端会打印新版本号但此时 WSL 发行版可能还在用旧内核运行。你需要在同一窗口里执行wsl --shutdown这条命令会强制关闭所有正在运行的 WSL 发行版和后台进程。等几秒钟让内核完全释放然后重新启动你的发行版wsl再依次跑wsl --version和uname -r确认两处版本都变了才叫真正完成。我见过不少朋友执行完update就急急忙忙去开 Docker Desktop结果它又弹一遍错其实就是因为发行版还在旧内核上跑着WSL 组件虽然更新了但没有应用到正在运行的实例上。提示wsl --shutdown不会删除你发行版里的文件和数据它只是关闭虚拟机。可以放心执行。如果你执行wsl --update时报了0x80070003或0x80072ee7这类错误码先别慌这不是你操作的问题大概率是网络通道或服务状态问题后面第六节我会单独讲排查路径。4. 自动更新失效时的兜底手工安装内核 MSI4.1 先找到微软官方手动安装包的位置如果你的环境里wsl --update反复失败比如公司安全策略禁用了命令行更新、网络完全不通或者系统组件损坏导致无访问 CDN那就走手动路线。打开浏览器进微软官方 WSL 文档找到手动安装Manual Installation这一页往下翻到Step 4 - Download the Linux kernel update package。这里会提供对应架构的内核更新包下载链接。绝大多数人用的是 x64 架构下载那个wsl_update_x64.msi即可。这里有个容易踩的坑微软有些文档页面的下载链接会直接跳到一个带版本号的稳定包但不会明确告诉你这是 5.10 内核还是 5.15 内核。你只需要记住一点只要是当前官方文档页标注的最新内核包装上去就是高于 5.15 的现代内核不用纠结文件名里的具体版本。4.2 安装前后各检查一遍内核目录下载完成后先关掉所有正在运行的 WSL 终端和发行版再双击运行 MSI。安装向导基本就是一路 Next没有任何复杂选项。装完别急着走验证一次。回到 PowerShell 执行wsl --version看到内核版本那边出现5.15.x甚至6.x说明 MSI 成功覆盖了旧内核。如果你想再确认一层可以直接看系统盘里的内核镜像文件。路径为C:\Windows\System32\lxss\tools\kernel这个文件就是 WSL 实际使用的内核镜像没有.exe后缀。右键看属性里的修改日期如果时间戳停留在很多天以前说明 MSI 没有真正覆盖到目标目录尤其是杀毒软件或公司策略可能拦截了安装过程对System32的写入。处理办法是临时退出安全软件再以管理员身份重新安装一次 MSI。4.3 完全离线的机器怎么处理要是目标机器完全断网离线包里也只有老内核那就得换个思路在一台能联网的电脑上执行wsl --update --web-download成功后去以下目录捞缓存%LocalAppData%\Microsoft\WSL把缓存里的安装包和内核文件整个拷贝到离线机器然后手动覆盖安装。这个做法属于应急手段不保证每台机器都兼容但如果你面对的是一堆受控终端、又急需解决报错这比逐台读网卡抠包要实用得多。三种方式的取舍我整理了一张简单的对比表升级方式适用场景成功率注意点wsl --update网络通畅、标准环境高需要管理员权限依赖 Windows Update 服务wsl --update --web-download商店通道被卡、走 CDN 直连很高代理/防火墙环境下更推荐手动安装官方 MSI命令行失败、受控/离线环境中高需手动核对内核目录落盘时间5. 回到 Docker Desktop引擎启动、集成开关、验证一条龙5.1 冷启动的正确顺序别让它继续报旧病WSL 内核升级完成后Docker Desktop 那边往往还残留着旧的初始化状态。这时候直接双击图标结果经常是转了半天圈又弹同一个报错。原因很简单它记录的 WSL 组件信息还是旧的。正确的冷启动顺序找到任务栏右下角的 Docker 鲸鱼图标右键退出Quit确保它不是最小化到托盘而是彻底退出的状态。打开任务管理器在进程标签里检查Docker Desktop.exe、com.docker.backend.exe是否有残留有就手动结束掉。重新启动 Docker Desktop。等托盘图标从转圈变成稳定的状态表示初始化完成。这一步看起来只是重启一下实际上是在清空 Docker Desktop 对旧 WSL 内核的记忆。跳过它的后果就是你升级完内核后还对着一模一样的报错干瞪眼。5.2 打开 WSL 集成开关让容器和开发环境连起来Docker Desktop 起来之后进设置面板Settings - General确认 Use the WSL 2 based engine 是勾选状态。Settings - Resources - WSL Integration把你常用的发行版比如Ubuntu-22.04对应的开关打开然后点 Apply Restart。这个 WSL 集成开关值得多说一句。它的作用是让 Docker Desktop 的引擎进程直接挂载到你指定的发行版环境里意味着你在这个发行版终端里敲docker ps、docker-compose up时走的是同一个引擎而不是再临时起一个新后端。不开的话你装在 Ubuntu 里的 docker 客户端就找不到引擎报 Cannot connect to the Docker daemon。第一次正常启动 Docker Desktop 时它会自动创建docker-desktop和docker-desktop-data两个虚拟发行版。这两个名字看起来像乱入的其实是 Docker Desktop 用来存放引擎和数据卷的内部组件别手贱去wsl --unregister它们除非你明确知道自己在做数据迁移。5.3 跑一遍 hello-world才算真正通关打开你自己的发行版终端输入docker version重点看Client和Server两段。如果你能看到 Server 段的信息Engine 版本、OS 类型说明客户端成功连上了 Docker 引擎后端没问题了。再拉个最经典的镜像验证连通性docker run hello-world看到终端输出 Hello from Docker! 那一段欢迎词整个链路就算彻底通了。顺手可以用wsl -l -v再看一眼状态NAME STATE VERSION * Ubuntu-22.04 Running 2 docker-desktop Running 2看到docker-desktop这个发行版处于 Running 状态就说明 Docker 引擎正挂在 WSL 2 下运行一切都符合预期。6. 我在这条路上踩过的坑以及长期维护建议6.1wsl --update卡住或报错按这个顺序排查这块我单独说是因为它特别容易把人的耐心消耗光。常见的失败情况大致有四种不是管理员权限报Access is denied或者命令无任何输出。处理方式只有一种回到第三步确认窗口标题栏带着管理员三个字。网络代理和防火墙拦截公司的全局代理会把wsl --update的请求截走甚至导致 TLS 握手失败。刚才说的--web-download参数就是专门对付这情况的再不行就临时关掉代理、换手机热点秒下。Windows Update 服务被禁用服务管理器里把wuauserv和BITS设为自动并启动。这一步做完再执行wsl --update会有立竿见影的效果。杀毒软件拦截部分安全软件会把 WSL 的内核更新包当可疑文件处理安装目录和时间戳都对不上。把路径加到白名单重新跑一次。一张表说清楚症状最可能原因首选处理Access is denied普通权限换管理员终端卡在 0% / 下载失败代理、防火墙、商店通道换--web-download临时关代理报 Windows Update 错误码更新服务被禁用启动wuauserv和BITS更新后内核文件时间戳不变安全软件拦截写入加白名单重装 MSI6.2 升级后 Docker Desktop 仍报错连环排查思路如果wsl --version和uname -r都显示内核已经 5.15Docker Desktop 还继续弹 WSL needs updating这时候问题就发生在 Docker Desktop 自身的缓存和组件状态上。第一检查是否还有其他发行版还开着旧内核。多发行版环境下Docker Desktop 检测的是所有运行中的发行版而不只是默认的那个。用wsl -l -v查看全部对每个非 docker-desktop 的发行版执行wsl --terminate 发行版名然后把 Docker Desktop 彻底退出重开。第二查 Docker Desktop 日志。日志目录在%LocalAppData%\Docker\log打开 log.txt 或者 Docker Desktop 安装目录下的日志文件搜 wsl needs updating 这个关键词看它附近的报错堆栈。如果是权限问题日志里会直接指出如果是某个组件初始化失败也会给到具体模块名。第三最激进但最有效的办法让 Docker Desktop 重新初始化 WSL 组件。退出 Docker Desktop 后执行wsl --unregister docker-desktop wsl --unregister docker-desktop-data再重启 Docker Desktop它会重新创建这两个内部发行版。说实话这招能清掉九成以上的残留问题但代价是之前 WSL 里的 Docker 数据卷内容会发生变动生产数据一定要先备份。我自己只在开发机上用过这招公司服务器上不要乱来。6.3 给长期维护者的一句实在话根据我的使用经验这个报错之所以劝退很多人不是因为它难而是因为提示语写得特别像你的整个系统报废了实际上排查层级非常清晰WSL 组件版本 - 发行版内核版本 - Docker Desktop 是否重新初始化。长期来看我建议每过一两个月执行一次wsl --update让内核跟着微软的节奏走。Docker Desktop 的新版本只会提高对内核基线的要求不会降低。公司内部批量部署时优先把官方 MSI 下载到本地再分发省得每台机器都卡在自动下载。别把 Docker Desktop 和 WSL 的数据装到奇怪的盘符路径上默认位置能避开九成权限问题。遇到类似报错先花两分钟把版本信息查清楚比直接重装系统靠谱得多。最后再补一个细节给那台新笔记本处理完这个报错之后我顺手在 Ubuntu 里更新了docker-compose插件把她也拉到了最新版。现在她的机器上从启动 Docker Desktop 到跑起一个容器全程不超过半分钟再也没见过那个讨厌的英文弹窗。