☰
新版Docker Desktop迁移指南:WSL2 vhdx数据盘从C盘挪到D盘
2026/10/2 14:39:52 网站建设 项目流程

最近帮一个同事清理C盘,发现Docker Desktop占了将近40G空间,我第一反应是像以前一样,把docker-desktop-data这个WSL发行版迁到D盘去。结果打开终端敲wsl -l -v一看,发行版列表里只有一个docker-desktop,docker-desktop-data凭空消失了。查了下版本,人家已经升级到Docker Desktop 4.3以上,底层架构改了,原来的双发行版结构变成了单发行版,数据全塞在一个虚拟磁盘里。折腾了一圈,试了设置面板、WSL导出导入、直接挪vhdx文件这几种方式,总算把数据搬走了。把这套实测经验整理一下,给遇到同样问题的朋友一个参考。

这里的核心问题就一句话:4.3以上版本没有docker-desktop-data发行版,老办法失效了,但数据还是要从C盘迁走。下面我会先解释版本差异,再给你两套可以直接抄的迁移方案,最后把容易踩的坑全部列出来。

1. 4.3版本改了啥:docker-desktop-data去哪儿了

1.1 旧版的双发行版结构与迁移老办法

在Docker Desktop 4.3之前,Windows上安装Docker Desktop并开启WSL 2后端后,系统里会出现两个Linux发行版,一个叫docker-desktop,一个叫docker-desktop-data。前者负责Docker引擎的二进制文件和运行环境,后者专门存放镜像、容器层、卷等所有数据。

当时大家迁移数据,普遍的做法就是针对docker-desktop-data操作。因为WSL发行版默认装在C盘用户的AppData目录下,那个ext4.vhdx虚拟磁盘文件会随着镜像和容器越滚越大,C盘很容易爆。老办法通常是先wsl --shutdown关掉所有发行版,然后wsl --export docker-desktop-data D:\docker-desktop-data.tar导出,再wsl --unregister docker-desktop-data把原发行版注销,最后wsl --import docker-desktop-data D:\DockerData D:\docker-desktop-data.tar导入到新的路径。这一套操作下来,数据就物理迁移到D盘了,属于当时比较通用的做法。

1.2 新版的单发行版结构与数据盘位置

4.3版本之后,Docker Desktop为了简化架构、减少资源占用,把原来两个发行版合并成了一个。也就是说,你再看wsl -l -v,只剩一个docker-desktop。不仅“数据发行版”没了,连容器镜像的数据存放方式也变了——所有数据被放进了docker-desktop这个发行版对应的虚拟磁盘文件里。

这个虚拟磁盘文件在什么地方?实测路径通常是C:\Users\你的用户名\AppData\Local\Docker\wsl下面。里面还能看到data目录、disk目录等,具体文件名可能随版本略有差别,比如docker_data.vhdx、ext4.vhdx,但位置基本就在AppData\Local\Docker\wsl里。你只要看到这么大的一个.vhdx文件,那就是Docker Desktop的全部数据所在。

所以新版的迁移思路就变成了:不迁docker-desktop-data,改成迁docker-desktop这个发行版,或者直接迁AppData\Local\Docker\wsl这个目录。理解了这一点,剩下的操作只是换了个对象,逻辑和旧版差别不大。

2. 迁移前必须做的几步检查

2.1 确认Docker Desktop版本和WSL发行版列表

动手之前,先确认你的版本到底是不是4.3以上。很多人只是听别人说“新版没有docker-desktop-data”,结果自己查了一下发现明明有,那是还没升级,或者开启了某些兼容模式。Docker Desktop的版本号可以打开软件后在Dashboard右下角看,也可以在命令行执行:

docker version --format '{{.Server.Version}}'

这个命令显示的是Docker引擎版本,跟Docker Desktop版本不完全一致,但也能作为参考。更准确的方法是查看Docker Desktop界面中的“About Docker Desktop”。确认版本后,再用管理员身份打开PowerShell,执行:

wsl -l -v

如果输出里只有docker-desktop,没有docker-desktop-data,恭喜,你进入了新版架构。如果两个都在,那说明你的版本可能还在4.2或者更老,或者Docker Desktop还在进行数据迁移的过渡状态,建议先不要手动操作,等它稳定。

2.2 停止Docker Desktop并清掉残留进程

这一步不做,后面迁移极容易失败。先在系统托盘右键Docker Desktop图标,选择“Quit Docker Desktop”,确保它彻底退出。然后打开任务管理器,看看有没有com.docker.backend、com.docker.build、vpnkit之类的进程顽固地留在后台。有的话直接结束进程。

为了彻底,还可以在PowerShell里执行:

wsl --shutdown

这个命令会停止所有正在运行的WSL发行版,包括Docker Desktop的虚拟化环境。如果不执行这步,docker-desktop发行版还在运行,你后面去移动它的vhdx文件,文件被占用会直接报错,或者迁移完数据不一致导致启动失败。

注意:wsl --shutdown会同时关闭你自己的WSL发行版(比如Ubuntu),如果你有终端里正在跑的任务,先保存好工作再执行。

2.3 备份确实是必要的

迁移数据这种操作,理论上失败的概率不高,但一旦失败,最轻的是Docker Desktop启动不了,严重的可能让之前的镜像全部消失。别偷懒,至少把重要的镜像和容器数据导出一份。

如果你的迁移目标是腾出C盘空间,那在目标盘上临时放一个导出文件是可以接受的。执行:

wsl --export docker-desktop D:\backup\docker-desktop-backup.tar

注意这个文件可能会非常大,几十G很常见,建议先确认D盘剩余空间足够。导出完再继续后面的迁移。如果你觉得镜像数据无所谓,只在乎换机器后重新拉取,那可以不备份,直接迁。但凡事有万一,备份一次多花十几分钟,后面出问题时能救你一命。

3. 新版迁移实操:两种可用方案

3.1 官方设置里的Disk image location

别急着敲命令,新版Docker Desktop其实提供了一个改磁盘位置的入口。打开Docker Desktop,点右上角齿轮进入Settings,找到Resources,再点Advanced,里面有一个Disk image location。默认是C:\Users\你的用户名\AppData\Local\Docker\wsl,你可以直接改成D:\Docker\wsl,然后点击“Apply & Restart”。

如果数据是全新的,或者你只是想给以后的数据换个存放位置,这个官方设置是最省事的。但要注意一点:对已有数据,改变Disk image location不一定能帮你把现有镜像和数据搬过去。官方文档和很多实际案例都表明,这个选项更适合在安装后首次启用时设置,或者你愿意接受数据重组。我实测过,修改路径后如果原路径下已经有很多镜像,新路径下会看不到历史镜像,需要重新拉取。

所以,如果你的需求只是“把现在已经挤爆C盘的数据挪到D盘”,这个方案并不理想。更推荐下面这个。

3.2wsl --export/--import整体迁移 docker-desktop

这是目前最稳妥、能完整保留镜像和容器数据的方式。思路跟旧版迁移docker-desktop-data完全一样,只是把操作对象换成docker-desktop。步骤如下:

第一步:确保Docker Desktop已退出,执行wsl --shutdown,让所有WSL环境停止。

第二步:导出docker-desktop发行版:

wsl --export docker-desktop D:\backup\docker-desktop.tar

导出过程可能要等一段时间,看你的数据量大小,镜像越多时间越长。如果中途报错,先查看错误信息,最常见的是“Failed to attach disk”或文件占用,这种情况把Docker Desktop完全退出,再wsl --shutdown,然后再导出。

第三步:注销原发行版。确认导出文件没问题后,执行:

wsl --unregister docker-desktop

执行完这个命令,docker-desktop发行版会被删除,对应的C盘磁盘文件也会被清理(注意不会立刻释放空间,需要手动优化系统盘或者等待系统后台处理)。这步操作前一定要确认导出成功,否则数据就没了。

第四步:导入到新位置。比如你想放在D盘D:\DockerData\wsl目录下,执行:

wsl --import docker-desktop D:\DockerData\wsl D:\backup\docker-desktop.tar

注意导入命令三个参数,第一个是发行版名称,必须叫docker-desktop(Docker Desktop启动时按这个名字查找,改别的名字它不认)。第二个是新位置目录,第二个是导出文件路径。导入后,docker-desktop的数据文件就会玄学地出现在D:\DockerData\wsl下。

第五步:启动Docker Desktop验证。导入完成后,重新打开Docker Desktop。它启动时如果发现docker-desktop发行版存在且正常,就会直接使用。你可以看一下右下角图标变成绿色,然后执行docker ps,看镜像是否都回来了。镜像用docker images检查。

这个方案我实测下来最多的问题有两个:一是导出时因为没彻底退出Docker Desktop导致失败,二是导入后Docker Desktop还是无法启动,因为是WSL发行版目录权限问题,把导入目录的权限放开给当前用户就好。遇到启动失败时,先用wsl -l -v看看发行版是否存在,再用wsl -d docker-desktop进入发行版看日志,基本能找到原因。

3.3 直接移动vhdx文件加目录联接(补充法)

如果你已经知道新版数据文件的位置,还有一招更直接:把AppData\Local\Docker\wsl整个目录移动到D盘,然后创建一个目录联接,让原路径指向新路径。这个方法的原理是骗过Docker Desktop,让它以为文件还在老位置,实际上已经放到D盘了。

操作方式:

  1. 退出Docker Desktop,执行wsl --shutdown。
  2. 把C:\Users\你的用户名\AppData\Local\Docker\wsl这个目录整体剪切到D:\DockerData\wsl。注意是剪切,不是复制,否则C盘空间还是没释放。
  3. 在原来的位置创建目录联接:
mklink /J "C:\Users\你的用户名\AppData\Local\Docker\wsl" "D:\DockerData\wsl"

注意mklink需要以管理员身份运行PowerShell或CMD。创建成功后,Docker Desktop再访问原路径,实际读取的就是D盘的内容。

这个方法比WSL导出导入快很多,因为不需要打包和重新解包。但有一个关键前提:你移动的时候,Docker Desktop和所有WSL发行版必须是完全停止状态。而且移动期间如果断电或者中断,可能造成vhdx文件损坏。所以我一般是两个方案都能用,时间紧急的时候用这个,想稳一点就用导出导入。

重要提示:目录联接(Junction)不是简单的快捷方式,它对于操作系统和对该路径进行操作的进程来说,就是一个真实的目录路径。所以Docker Desktop完全感知不到差异。

4. 迁移后的验证与常见坑速查

4.1 迁移后Docker Desktop启动失败怎么办

启动失败是最常见的坑,尤其是在用wsl --export/--import方案后。失败原因往往不是迁移本身,而是导入的发行版状态不对。打开PowerShell,执行:

wsl -l -v

看docker-desktop是否处于Running状态,如果没有状态后台显示“Stopped”,试着手动启动:

wsl -d docker-desktop

如果不能正常进入,说明导入的发行版有问题。检查导入路径是否正确、权限是否足够。可以尝试注销后重新导入,导入时注意wsl --import会重置默认用户,但docker-desktop是Docker Desktop自己管理的发行版,一般不会涉及用户配置问题。

还有一种情况,Docker Desktop启动时提示“WSL 2 installation is incomplete”,常见原因是Docker Desktop版本和WSL内核不匹配。这时候去Windows设置里检查“Windows功能”里的“适用于Linux的Windows子系统”和“虚拟机平台”是否都勾选了,勾选后重启再试。

4.2 为什么迁移后C盘空间没有立刻释放

很多人迁移完发现,C盘可用空间没有变多,急得不行。实际上,虚拟磁盘文件虽然被移动了,但WSL原始发行版的磁盘空间需要时间回收。如果用wsl --unregister docker-desktop注销了发行版,C盘对应的vhdx文件会被删除,但空间可能仍然显示被占用。这时打开“优化驱动器”或者“磁盘清理”,让系统执行一次碎片整理和空间回收,等几分钟再看,C盘空间就会明显多出来。

如果你用的是移动目录加联接的方案,那C盘原目录已经空了,只是目录联接本身不占空间,C盘应该立刻释放才对。如果没释放,检查是不是把原路径做成了复制,或者还有docker-desktop-data的残留文件。

4.3 新版仍然可以用的硬链接或符号链接注意点

除了目录联接,也有人用符号链接或硬链接来迁移。但要特别注意,符号链接(Symbolic Link)对WSL和Docker Desktop的支持有时候不太稳定,因为部分程序会解析真实的路径,遇到符号链接可能会创建新目录或者读写异常。目录联接(Junction)是Windows NTFS专门为本地目录设计的,兼容性最好,我实际测试下来比符号链接稳得多。

另外,不管用哪种方式,迁移完都要检查一下Docker Desktop的设置,看Disk image location是不是还指向C盘老路径。如果指向老路径,但老路径又被你用目录联接重定向到了新位置,那没问题;如果Docker Desktop自己改了路径到新位置,同时你又用了目录联接,可能会形成二次重定向,看起来能工作,但一旦有一天你删除了目录联接,Docker Desktop就又找不到数据了。最简单的方式是迁移后把Disk image location设置成和实际文件所在位置一致,不要让自己落入“路径去找路径”的迷宫。

4.4 顺手解决Docker Desktop自身残留和缓存

既然迁移的是数据,我建议顺便把Docker Desktop的缓存也清一清。打开%LOCALAPPDATA%\Docker目录,看看除了wsl目录之外,还有没有大量临时文件、日志文件、metrics数据等,这些常常也有好几个G。把log、tmp这些子目录直接删掉不影响正常使用,Docker Desktop会自动重建。当然,删除之前确保Docker Desktop完全退出,避免文件占用。

还有一点:如果你C盘紧张是因为WSL的Ubuntu发行版也占了很多空间,那这趟迁移只能算解决了一半。顺手把其他发行版也检查一遍,统一迁到D盘,会舒服很多。WSL发行版的迁移可以同样用wsl --export/--import,命名规则和Docker Desktop不一样,但你自己的Ubuntu可以随意改发行版名称。

5. 关于迁移路径,你还可以这样想

Docker Desktop 4.3以上版本虽然去掉了docker-desktop-data,但本质上数据没变,只是从一个“明码标价的发行版”变成了“藏在docker-desktop发行版里的磁盘文件”。学会看wsl -l -v和AppData\Local\Docker\wsl目录,就能立刻定位到数据盘。老办法的迁移逻辑依然有效,对象从docker-desktop-data换成docker-desktop或数据目录,仅此而已。

我个人在实际操作中,遇到C盘不够用时最常用的还是wsl --export/--import,虽然慢,但最不容易出幺蛾子。移动目录加mklink /J的方式快,适合数据量特别大、又不想等的情况。至于官方设置里的Disk image location,我建议你把它视为“新装时的好习惯”,而不是“在线迁移的快捷键”,因为实测它更倾向于创建一份新的数据目录,历史数据不会跟着走。

最后再分享一个小技巧:如果你机器上有多个WSL发行版,迁移前先全部导出到一个中转硬盘,再统一处理后导入,整个过程会更清晰。别嫌麻烦,磁盘水位越来越高的时候,提前花一小时整理,后面能少难受一整年。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询