news 2026/10/17 9:18:32

WSL2下Docker Desktop迁移到D盘:彻底解决C盘空间不足

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WSL2下Docker Desktop迁移到D盘:彻底解决C盘空间不足

自从开始用 WSL2 跑 Docker,C 盘空间就见鬼一样地往下掉。一开始以为是镜像下多了,清理几次发现根本治标不治本,后来查了才发现问题出在根子上:Docker Desktop 默认会把整个 WSL 发行版的数据放在C:\Users\用户名\AppData\Local\Docker\wsl这个目录下面,而且是虚拟磁盘文件的形式。VHDX 这个文件的特点就是能自动增长,但不轻易缩水,如果你拉了几个大镜像,这个文件能轻松膨胀到几十个 G,再配合 WSL 本身的虚拟内存和缓存,几百 G 的 C 盘瞬间就吃紧了。

今天这篇就把我从 C 盘迁移 Docker Desktop 全部数据到 D 盘的完整过程说清楚,包括原理、实操、坑和回滚方案,尽量写得像我当初踩坑之后希望看到的那种保姆级教程。

1. 先搞清楚数据到底存在哪里

1.1 Docker Desktop 和 WSL2 的分工关系

很多从 Windows 老版 Docker Toolbox 时代用过来的朋友,对 Docker Desktop 有个常见的误解:以为它就是个类似 VirtualBox 的虚拟机软件,装的镜像都在"虚拟机里",跟 Windows 文件系统没关系。这个理解其实也不算全错,只不过到了 WSL2 时代,Docker Desktop 用的底层不是自己的管理程序,而是 Windows 自带的 WSL2 功能。

具体关系可以这样理解:Docker Desktop 更像一个"租客",它跑在 WSL2 这个"房子"里面。WSL2 本身又是 Windows 内置的一个轻量虚拟机,专门跑 Linux 内核。Docker 的所有容器、镜像、卷、构建缓存,本质上都是 Linux 文件系统里的数据,而这个 Linux 文件系统住在"房子"用的虚拟硬盘(VHDX 文件)里。

所以问题就很清楚了:想要把 Docker 的数据迁到别的盘,关键不是改 Docker Desktop 设置里的那个"Disk image location",而是要动 WSL 发行版的注册位置。因为 Docker Desktop 自己创建的发行版叫docker-desktop,你的容器数据都在这个发行版里。

1.2 为什么直接删镜像治标不治本

我见过不少朋友,C 盘红了就开始手动清理镜像。用docker system prune把悬空镜像删掉,再用docker system df看一眼,发现释放了几个 G,心里还挺美。但实际上,那个ext4.vhdx文件不会因为你删了容器里的内容就自动缩小。

我打个比方:虚拟磁盘文件就像一条河里挖出来的蓄水池,你往里面灌过多少水,池子的堤岸就会修多宽。你把水抽掉了,但堤岸还在,空间又被池子占着。Docker 的虚拟磁盘也是这个逻辑,镜像删了,VHDX 文件依然保持之前扩展过的大小。你要是反复拉大镜像再删除,VHDX 会变成一个"虚胖"的小胖子,白白占着 C 盘空间。

想要根治,就得把整个 VHDX 文件挪出 C 盘,让它以后只往别的盘增长。只要迁移一次,再配合定期清理,C 盘的压力就能彻底缓解。

1.3 迁移的核心思路:WSL 的导出和导入

WSL 发行版的迁移在微软提供的最原始机制就是wsl --export和wsl --import。导出会生成一个 tar 包(里面是完整的 Linux 文件系统),导入的时候可以指定新盘符目录,这样发行版的数据就从老的 VHDX 挪到了新的 VHDX 里。

Docker Desktop 虽然会自动创建两个发行版,但迁移逻辑通用。只不过步骤上比普通 WSL 发行版要复杂一点,因为它还有个 Docker Desktop 主程序要处理,而且 Docker Desktop 运行的时候会占用这些发行版,不能直接迁移。

实际操作中我建议的思路是这样的:先停掉 Docker Desktop,把 WSL 关掉,然后找到 Docker 用来存放数据的发行版名,导出再导入,最后重新配置 Docker Desktop 的启动参数指向新的位置。

2. 迁移前的准备工作和磁盘状态检查

2.1 确认 Docker 和 WSL 的版本号

动手之前先确认一下环境,不同版本的 Docker Desktop 和 WSL 在细节上会有差异。打开 PowerShell,执行:

wsl --version docker version

如果wsl --version显示 WSL 1.x 或者没有显示具体子版本,说明你可能还在用旧版 WSL,建议先从"启用或关闭 Windows 功能"里把"适用于 Linux 的 Windows 子系统"和"虚拟机平台"勾上,再升级到 WSL2。

WSL 版本不要是 1.0 或者更老的 Preview 版,我测试下来用 2.0 以上的版本做导出导入最稳。

2.2 找到 Docker 相关的 WSL 发行版

打开 PowerShell 输入:

wsl --list --verbose

你会看到类似这样的输出:

NAME STATE VERSION * docker-desktop Stopped 2 docker-desktop-data Stopped 2

早期版本 Docker Desktop 用的发行版名是docker-desktop和docker-desktop-data,新版(4.30 之后)逐渐整合成一个docker-desktop包含了数据也在里面。但无论名字怎么变,关键是你自己要能认出哪个发行版在承载镜像数据。如果分不清,可以看发行版目录大小。

在 PowerShell 里定位 VHDX 文件的位置:

Get-ChildItem -Path "$env:LOCALAPPDATA\Docker\wsl" -Recurse

正常情况下你会看到:

C:\Users\你的用户名\AppData\Local\Docker\wsl\data\ext4.vhdx C:\Users\你的用户名\AppData\Local\Docker\wsl\disk\docker_data.vhdx

这里面data\ext4.vhdx就是 Docker Desktop 用来放容器层、镜像层和卷的核心数据文件。disk\docker_data.vhdx是存储在 Docker Desktop 自身的数据(新版本可能会看到不同的目录结构,但原理一样)。

从这一步开始,就请记住这个路径,后面导出导入都跟它离不开。

2.3 记录当前空间占用情况

建议在迁移前先看一次数据体积,一方面是评估迁移时间,另一方面是迁移后做对比验证。

PowerShell 命令:

Get-ChildItem -Path "C:\Users\你的用户名\AppData\Local\Docker\wsl" -Recurse | Measure-Object -Property Length -Sum

输出里的 Sum 除以 1MB 或者 1GB,就知道大概多大。30G 的数据导出可能要等 10-20 分钟,耐心点。

3. 方案选型:先备份还是直接迁移

3.1 我为什么不推荐直接用 Docker Desktop 设置里的 Disk image location

Docker Desktop 设置界面的 Resources > Advanced 里确实有个Disk image location选项,字面上看可以直接改虚拟磁盘位置。

很多人的第一反应就是改这里,但我要提醒你,这个功能有历史遗留问题。在部分版本中,修改了这个位置之后,新数据会写到新路径,但旧数据还在老路径,你要自己手动搬。更麻烦的是,如果你在迁移过程中改动了路径且没有完全退出 Docker Desktop,可能导致新的发行版初始化失败,Docker 起不来。

我遇到过的最难缠的情况是:设置好之后 Docker Desktop 提示"Failed to mount WSL distro",但 C 盘里面数据还在,新位置又有新生成的一堆文件,两头都乱。

所以我最终的方案没有依赖那个选项,而是走wsl --export/wsl --import的老路,干净清爽,可控性最强。

3.2 备份优先原则

可以这么说:凡是涉及"全量搬迁"的操作,没有备份就是耍流氓。Docker 数据虽然大部分是缓存和镜像,但万一你有重要的容器数据卷,丢了就真的没了。

我的备份策略是:直接复制ext4.vhdx文件到备份目录,而不是做docker run方式的容器内备份。这样最接近"磁盘级快照",还原的时候只要把 VHDX 放回去就行。

备份命令:

$backupDir = "D:\DockerBackup\wsl-backup" New-Item -ItemType Directory -Path $backupDir -Force Copy-Item -Path "C:\Users\你的用户名\AppData\Local\Docker\wsl\data\ext4.vhdx" -Destination "$backupDir\ext4.vhdx.bak"

备份时间取决于文件大小,建议在跑备份的时候别同时拉镜像或者启动容器,不然 VHDX 正在被写入会造成复制出来的文件不一致。

3.3 迁移目标路径的选择建议

新位置尽量不要放在系统盘(C 盘)上,最好选一个固态硬盘的独立分区。D 盘如果是一块独立的 NVMe SSD,是最理想的;如果 D 盘和 C 盘是同一块物理硬盘上的两个分区,那迁移的意义只剩下整理逻辑盘符,对性能没有本质提升。

还有一个小建议:路径不要有空格,不要用中文,不要放在 WSL 的 UNC 路径下。比如D:\Docker\WSL这种就非常稳。之前有人把路径写成D:\Program Files\Docker Data,导入时会出现各种转义字符问题,折腾得不行。

4. 实操步骤:完整迁移 Docker Desktop 数据

这一步我按照实验过的顺序一步一步写,你照着做基本不会翻车。

4.1 停止 Docker Desktop 和所有 WSL 实例

关键点在于"干净地退出",而不是直接关掉右上角窗口。Docker Desktop 在托盘区域依然有后台进程,直接退出窗口并不会停止 WSL 发行版,你必须先设置退出时停止 WSL。

先打开 Docker Desktop > Settings > General,勾选Use the WSL 2 based engine和Start Docker Desktop when you sign in看你自己习惯,但必须确认Use the WSL 2 based engine是开着的。

然后退出 Docker Desktop:右键托盘图标,选择Quit Docker Desktop,最好别直接点关闭按钮。

退出后再打开 PowerShell,执行:

wsl --shutdown

这会把所有的 WSL 发行版全部关掉。为了确认没有进程占用,再执行:

wsl --list --verbose

看到所有 NAME 的 STATE 都是 Stopped,就说明可以继续了。如果还有 Running,等几秒或者重启一次 Windows 再操作,强行继续容易失败。

4.2 导出 Docker Desktop 的 WSL 发行版

导出命令:

wsl --export docker-desktop-data "D:\Docker\WSLBackup\docker-desktop-data.tar"

注意发行版名要写对。不同版本可能是docker-desktop-data,也可能新版 Docker Desktop 把数据整合到了docker-desktop里,但 Windows 版本不同名字会有差异。稳妥的做法是执行一次:

wsl --list --running wsl --list --all

把看到的全部发行版名记录下来,然后一个一个导出。

导出过程会输出进度条,速度取决于数据量大小和磁盘性能。如果是几十个 G,可能要十分多钟,期间不要关终端,不要待机。

导出完成后,插一句:如果你担心 tar 包完整性,可以用dir看大小,跟原 VHDX 文件的"物理占用"做个对比。tar 包一般会比 VHDX 文件小,因为 VHDX 有未使用空间,而 tar 是实际文件内容。

4.3 注销旧的 WSL 发行版

这一步不可跳过。如果不注销,重新导入同名发行版会冲突,系统会提示你"distribution with the name already exists"。

命令:

wsl --unregister docker-desktop-data

关于这条命令多说一句:很多朋友不敢执行,怕把 Docker 数据清空。实际上这个命令只是把 WSL 的"注册信息"从 Windows 里移除,并且删除对应的虚拟磁盘文件引用,并不会删除刚才导出的那个 tar 包。只要我们备份做完了,这里就大胆执行。

再补一句:docker-desktop这个发行版(不含 data 后缀的)也建议注销。如果需要 Docker Desktop 重新生成,我们可以通过重装或者重置来恢复,但这两个发行版反正都会在新位置重建,所以整体注销掉最干净。

4.4 导入到新路径

现在把 tar 包导回到新位置,注意--import需要指定发行版名、新目录和 tar 包路径,顺序别弄反。

wsl --import docker-desktop-data "D:\Docker\WSL\data" "D:\Docker\WSLBackup\docker-desktop-data.tar" --version 2

格式是:wsl --import <发行版名> <安装目录> <tar文件> [--version 2]。

这里有几个细节:

  • 安装目录必须是空的,如果D:\Docker\WSL\data已存在且有内容,导入会报错。提前New-Item -ItemType Directory -Force建好目录,但保证目录里没有任何文件。
  • --version 2强制使用 WSL2,虽然现在的默认版本基本已经是 2 了,但加上这个参数更保险。
  • 导入成功后,这个发行版会默认以 root 用户身份启动。Docker Desktop 对这个有特殊要求,所以导入之后还要改一下默认用户。这个坑后面细说。

对docker-desktop发行版(如果有的话)也做同样处理:

wsl --import docker-desktop "D:\Docker\WSL\distro" "D:\Docker\WSLBackup\docker-desktop.tar" --version 2

4.5 修改默认用户配置

WSL 普通发行版在导入后默认用户是 root,对 Docker Desktop 来说问题不大,但有些版本的 Docker Desktop 会通过 WSL 里的 socket 通信,用户不一致可能导致权限异常。

如果导入后你执行wsl -d docker-desktop-data登录进去,发现自己成了 root,那就需要额外处理。但我在这里想说明一下:实际操作中我们一般不手动登录 docker-desktop-data,而是直接启动 Docker Desktop,让它自己管理。所以默认是 root 还是你的用户名,其实影响不大,关键是 Docker Desktop 能否读到/var/run/docker.sock。

不过,如果你导入之后发现 Docker Desktop 起不来,检查日志的时候发现权限相关的错误,可以试试进入发行版执行:

echo -e "[user]\ndefault=你的用户名\n" >> /etc/wsl.conf

不是所有环境都需要这么做,我在 Windows 11 上实测过不配也能正常用,但提前给个备用方案总归是好的。

4.6 启动 Docker Desktop 并验证迁移结果

全部发行版导入完成后,在开始菜单打开 Docker Desktop。这时 Docker Desktop 会自动启动 WSL 发行版,并读取位于新路径D:\Docker\WSL\data\ext4.vhdx的数据。

正常情况你会看到 Docker Desktop 的鲸鱼图标转一两圈变绿,然后可以在终端执行:

docker ps docker images

发现原来的容器和镜像我都在,就说明迁移成功了一大半。

此时再回 PowerShell 看 C 盘空间:

Get-ChildItem -Path "C:\Users\你的用户名\AppData\Local\Docker\wsl" -Recurse | Measure-Object -Property Length -Sum

正常情况 C 盘原来的 ext4.vhdx 和 docker_data.vhdx 已经没有了(因为 unregister 时删了),剩下一些日志和配置文件,体积很小。

再确认新位置的磁盘占用:

Get-ChildItem -Path "D:\Docker\WSL" -Recurse | Measure-Object -Property Length -Sum

对比数量级,正确的话两者差距在一个合理的范围内,D 盘这边的占用应该基本等于原来 C 盘那边的全部数据量。

5. 踩坑实录:迁移过程中遇到的那些坑

实操过程中不可能一点问题没有,下面几个是我自己踩过、以及朋友来找我帮忙时最常见的坎,整理出来供大家少走弯路。

5.1 WSL 版本过低导致 --import 失败

有一回我在一台 Windows 10 老版本机器上做迁移,执行wsl --import一直报:

The specified registry key could not be found

排查下来是 WSL 内核太旧,wsl --import功能不完整。解决办法是:

wsl --update

或者去"设置 > 应用 > 启用或关闭 Windows 功能"里把"适用于 Linux 的 Windows 子系统"和"虚拟机平台"都勾上,重启后再试。这个坑最隐蔽,因为报错信息不提示版本,只提示注册表缺失。

5.2 Docker Desktop 起不来并报 "Docker Engine stopped"

迁移后我启动 Docker Desktop,发现鲸鱼图标一直是红色,提示 "Docker Engine stopped"。打开日志文件%LOCALAPPDATA%\Docker\log\host\下的日志,看到了类似:

Failed to mount WSL distro: An error occurred while accessing the WSL distro

这个大概率是 __WSL 发行版内部损坏或者新路径的目录权限问题。我当时检查了 D 盘目录属性,发现文件夹权限被某个安全策略限得死死的,Docker Desktop 的进程无法写入 socket 文件。

解决方法是:把D:\Docker\WSL目录的权限给当前用户完全控制,不行就直接给Authenticated Users完全控制。另外,确认你的新路径没有启用"压缩内容以节省磁盘空间"或者"加密内容"选项,右键目录 > 属性 > 高级,把那两个勾去掉。这个细节很少人提,但真的会因为文件级别的压缩加密导致 Docker 读取 VHDX 时各种奇怪报错。

5.3 容器数据还在但端口映射过不去

迁移完成后docker ps -a能看到容器,但访问端口发现不通,进入容器日志也正常。我当时一度以为网络参数丢了。

后来发现,这是因为我导入了发行版之后,WSL 的 IP 地址发生了变化,Docker Desktop 里某些基于 IP 的代理配置失效了。所以 Docker Desktop 里的Resources > Network设置要重新确认,尤其是自定义了 DNS 或者 HTTP 代理镜像加速的,建议清空重启再配置一次。

5.4 怎样验证数据卷是否真的完整

最靠谱的验证方式不是光看镜像列表,而是挑一个有数据卷的容器,去容器里创建一个标记文件,然后在 Windows 上确认文件出现在容器卷对应的物理路径中。或者更简单点,让容器写入数据,然后在新路径下的 ext4.vhdx 里面使用 wsl 命令行进入发行版查看:

wsl -d docker-desktop-data ls -lah /var/lib/docker/volumes/

如果你能看到原来的卷目录,且里面文件时间戳没变,说明备份完整。我迁移完专门把一个生产模拟项目的 MySQL 容器数据卷docker inspect确认Mounts里挂载点还在,再启动容器跑了一个查询,完美通过。

6. 迁移后可以做的事情:彻底瘦身 C 盘

6.1 压缩老 VHDX 文件(如果还在的话)

有一种情况是你没走unregister,而是直接把 ext4.vhdx 复制到新盘再修改 Docker Desktop 设置路径。这种情况下 C 盘残留的老 VHDX 虽然不再写入,但文件大小依然很大螺纹。想压缩它,可以在 WSL 里执行:

sudo fstrim -v /

然后回 Windows 用管理员 PowerShell:

Optimize-VHD -Path "C:\路径\ext4.vhdx" -Mode Full

前提是系统装了 Hyper-V 模块。不过么,如果你已经按我前面第 4 步做了完整的导出导入,C 盘的旧 VHDX 已经被自动删掉了,这一步可以省略。

6.2 定期清理 Docker 垃圾数据

迁移之后,C 盘虽然就安全了,但 Docker 数据如果一直不清理,D 盘迟早也会爆。我自己的习惯是每两周执行一次:

docker system prune -a --volumes

这个命令会删除所有未使用的镜像、容器、网络和卷。注意--volumes会连没有容器引用的卷一起删,如果卷里有重要数据,执行之前先用docker volume ls检查一下。

再设置日志驱动限制,防止容器日志无限增长。在daemon.json里加上:

{ "log-driver": "local", "log-opts": { "max-size": "10m", "max-file": "3" } }

这样单容器日志最多占 30M,再也不怕日志把磁盘塞满了。

6.3 通用建议:给 WSL 设置磁盘配额上限

WSL2 的 VHDX 默认是动态扩展,可以无限增长直到占满整个物理磁盘。如果你担心 D 盘空间失控,可以在发行版内设置 ext4 配额。

通过/etc/wsl.conf添加:

[automount] enabled = true options = "metadata,umask=22,fmask=11"

但真正的容量限制得靠 Windows 侧搞,wsl --manage子命令并不存在太多选项,目前最简单的控制手段其实是自己定期检查 D 盘容量,或者把 Docker Root Dir 的手动路径指到独立分区。

对我来说,只要数据不在 C 盘,空间焦虑就少了一大半,剩下的靠清理习惯就够了。

7. 结合 WSL 特性的进阶优化

7.1 把 Docker Root Dir 手动指到新盘

刚才的方案是把整个 WSL 发行版搬走,还有一种更轻量、更"Docker 原生"的思路:修改 Docker 运行时的工作目录。在 Docker Desktop 设置里,Resources > Advanced > Disk image location改到D:\Docker\DockerData,然后重启 Docker Desktop。

这个方案对 Docker Desktop 新版本来说是比较"正规"的迁移路径,但有一个前提:它只管 Docker 自己的数据,不管 WSL 发行版本身。如果 WSL 发行版或者某一时刻你手动创建的 WSL 发行版在 C 盘,那 C 盘依然有增长点。

所以我个人建议的做法是:如果完全是 Docker 用,就用 WSL 迁移方案一劳永逸;如果还要跑别的 WSL 发行版(比如拿 Ubuntu 做开发环境),再单独对待。

7.2 把 WSL 自身的 distro 目录搬到新盘

如果你除了 Docker Desktop 之外还手动装过 Ubuntu 之类的发行版,想整体搬走可以走同样的wsl --export/wsl --import流程。比如:

wsl --export Ubuntu "D:\WSL\Backup\ubuntu.tar" wsl --unregister Ubuntu wsl --import Ubuntu "D:\WSL\Ubuntu" "D:\WSL\Backup\ubuntu.tar" --version 2

不过在导入 Ubuntu 时默认用户会变成 root,需要手动恢复:

echo -e "[user]\ndefault=你的用户名\n" >> /etc/wsl.conf

然后重启发行版:

wsl --terminate Ubuntu wsl -d Ubuntu

你会发现用户已经变回来了,Bash 里的 PATH、环境变量等也能正常加载。

7.3 使用符号链接迁移部分目录的备选思路

有人问过我:能不能直接创建符号链接,把C:\Users\你的用户名\AppData\Local\Docker\wsl指向 D 盘目录?

理论上mklink /J可以做 junction(目录联接),但 Docker Desktop 更新时会重新创建目录结构,而且 WSL 服务启动时如果读不到正常的注册表项,可能产生"当前目录不存在"的错误。我试过一次,Docker Desktop 启动时直接报错,随后自己修复成了老目录。

因此这个办法看起来简单,实际上非常脆,不推荐新手尝试。如果非要用,得记住:先停掉 Docker 和 WSL,用完好的 VHDX 文件搬到 D 盘,再建 junction。但既然走这个流程了,不如干脆导出导入一了百了,还顺便把发行版文件整理干净了。

8. 常见问题排查速查表

写到这里,我把迁移中遇到的高频问题整理成一张速查表,方便你出问题时直接对号入座。

问题现象可能原因处理方法
wsl --import报 registry key errorWSL 内核版本太老wsl --update后重试,或升级 Windows 系统
Docker Desktop 启动后显示 Engine stoppedWSL 发行版无法挂载,VHDX 损坏检查目录权限,重设 VHDX,必要时从备份恢复
迁移后docker ps能看到容器但端口不通WSL2 IP 变化,代理或网络配置失效重新设置 Docker 网络、代理配置,重启 Docker
C 盘空间没减少旧的 VHDX 文件没删,或 Docker 还在 C 盘写了新数据确认wsl --unregister已执行,检查 Docker 设置
容器里数据不完整导出前容器还在运行,数据未刷入磁盘导出前先wsl --shutdown,确认所有发行版 Stopped
导入后无法用普通用户身份进入发行版WSL 默认用户变成了 root修改/etc/wsl.conf配置默认用户
Docker Desktop 更新后自动回退到 C 盘Docker 安装目录或设置被默认值覆盖更新后检查Disk image location和 WSL 注册列表

这张表没法覆盖所有稀奇古怪的报错,但 90% 的情况都落在这些框框里。如果遇到完全不认识的错误,第一件事就是看日志:Docker Desktop 的日志在%LOCALAPPDATA%\Docker\log\host\下,WSL 的问题多用wsl --debug或者 Windows 事件查看器里的"Hyper-V 虚拟机"日志。

9. 后迁移期的观察与还原方案

9.1 迁移后 Docker Desktop 升级的影响

Docker Desktop 每一次升级都可能重新创建 WSL 发行版或者修改配置文件,但不是每次都会把一个好好的迁移结果推翻。我经历的大版本升级,升级完成后 Docker 依然能正常读 D 盘的数据,因为发行版的注册表信息没有变,VHDX 文件自然还在原路径读取。

但不排除个别版本更新后,Docker Desktop 的安装程序会在旧的路径重新生成一个发行版,导致 C 盘有残留。所以每次 Docker Desktop 升级后,我建议看一次:

wsl --list --verbose

如果出现了名字相同但新的发行版,再确认%LOCALAPPDATA%\Docker\wsl\data下的 VHDX 是否还在,如果出现,说明 Docker 又重建了数据目录,这时候就要考虑把旧目录清理掉或者再做一次迁移。

9.2 如何回滚到迁移前状态

如果有人担心迁移失败想后退,只要你有备份的 tar 包和备份的 VHDX 文件,回滚其实非常快。步骤如下:

  1. 退出 Docker Desktop:托盘右键 Quit。
  2. 执行wsl --shutdown。
  3. 注销当前的 docker-desktop-data:wsl --unregister docker-desktop-data。
  4. 用备份的 tar 包重新导入到原来的 C 盘路径:wsl --import docker-desktop-data "C:\Users\你的用户名\AppData\Local\Docker\wsl\data" "D:\DockerBackup\wsl-backup\docker-desktop-data.tar" --version 2。
  5. 启动 Docker Desktop。

如果 tar 包也没了,只有 VHDX 备份,可以直接把 VHDX 放回原目录,然后重新注册发行版,但这个操作需要手工编辑注册表,很麻烦。所以再次强调:tar 包备份是回滚的生命线,别删。

9.3 多磁盘用户的一条额外建议

如果你的机器有三块硬盘,例如 C 盘是系统盘、D 盘是常用软件盘、E 盘是大容量机械盘,建议把 Docker 数据放在 SSD 上,哪怕是小容量的 SSD。Docker 对存储性能很敏感,容器 IO 频繁的应用如果放在机械盘上,你会明显感到拉镜像、启动容器变慢,数据库类型的容器更明显。我实测过同样一个 MySQL 容器,从 NVMe 迁到机械盘,查询延迟翻了好几倍。

如果只有一块机械盘但 C 盘已经满了,那也别纠结性能,先把数据迁出去保住系统盘再说,Docker 卡一点总比系统崩溃好。

10. 关于自动化和监控的补充经验

10.1 写一个清理脚本,防止 D 盘被慢慢吃满

迁移完成之后,平时的维护也需要一点自动化。我自己在 Windows 的计划任务里挂了一个 PowerShell 脚本,每周检查一次 Docker 相关目录的占用,如果磁盘剩余空间低于某个阈值,就自动执行一些常规清理任务。

简单脚本示例:

$thesholdGB = 20 $drive = Get-PSDrive -Name D $freeGB = [math]::Round($drive.Free / 1GB, 2) if ($freeGB -lt $thesholdGB) { docker system prune -f docker image prune -a -f }

大多数情况下直接手动执行也行,但配上计划任务能避免一些"不知不觉就满了"的情况。

10.2 监控 WSL 虚拟磁盘增长趋势

VHDX 文件增长跟容器使用习惯强相关。你有空可以在 PowerShell 里写个一行命令看看趋势:

Get-ChildItem "D:\Docker\WSL\data\ext4.vhdx" | Select-Object Name, @{Name="SizeGB";Expression={[math]::Round($_.Length/1GB,2)}}, LastWriteTime

隔一段时间看一次,如果发现 VHDX 增长极快,大概率是日志或者临时文件没限制好,回到第 6 节把日志驱动限制配置上,或者排查哪个容器一直在产生大数据。

10.3 容器数据备份方案简谈

最后再聊一聊更长远的数据安全。迁移只是把数据从一个盘挪到另一个盘,并没有新增冗余。如果你跑的是正式项目,建议在 Docker 之外再做一层备份。最粗暴的方法是定期docker commit,但说实话并不推荐。更稳的是对容器挂载的数据卷做文件级备份,或者用专门的备份工具。

我一般每周末对 Docker 数据目录打一个 tar 包到 NAS 或者移动硬盘,命令很简单,同样要先把docker-desktop-data停掉,或者用wsl --shutdown保证一致性:

wsl --export docker-desktop-data "E:\DockerBackup\docker-data-weekly.tar"

只要有这个 tar,不管 Docker Desktop 怎么坏、Windows 怎么出问题,你都能随时恢复到上一个可用状态。别嫌笨,这种原始手段往往最可靠。

结尾

从 C 盘点爆红到逐步排查 VHDX 占用,再到导出、注销、导入、配置权限,中间踩过版本太老、目录权限、IP 变更这些坑,最终把 Docker Desktop 整个搬到了 D 盘。说句实在话,搞完之后我心里那块石头就算落地了,之后每次看到 C 盘剩余空间稳步回归到三位数,都觉得这个折腾值。

我个人实际操作中的几个习惯,供你参考:迁移之后不要马上删备份 tar 包,至少留一个月,等 Docker Desktop 升级过一两次,确认一切稳定再清理;平时多留意docker system df的输出,它比 Windows 的存储设置更懂 Docker 的空间管理;再就是尽量不给 C 盘留任何可能膨胀的虚拟磁盘,不管它是 WSL 还是别的虚拟机。磁盘空间这种东西,等它满了再救,远不如提前布局省心。希望这篇迁移手记能帮你把 Docker 的数据安安稳稳地从 C 盘挪出去,少走一段我当初反复折腾的弯路。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/17 9:16:06

SSM+Vue优选农产品销售系统:从数据库设计到答辩全指南

直接代入一个场景&#xff1a;打开选题列表&#xff0c;一眼扫过去全是"XXX管理系统的设计与实现"&#xff0c;而"优选农产品销售管理系统"这类带电商属性的题&#xff0c;多半是被导师推荐或者自己在教务系统里挑的。SSM加Vue的组合在学生项目里出现频率高…

作者头像 李华
网站建设 2026/10/17 9:14:50

video-use:视频数据全链路处理的方法论与实战

1. 项目概述&#xff1a;一个围绕视频处理全链路的实用型工具集命名逻辑“video-use”这个名称乍看像随手打的标签&#xff0c;但放在当前技术生态里&#xff0c;它其实精准锚定了一个高频、刚需、却长期缺乏统一认知的实践场景——不是单纯讲“怎么用视频”&#xff0c;而是聚…

作者头像 李华
网站建设 2026/10/17 9:13:54

SpringBoot+Vue考研社区前后端分离项目实战:从需求到部署全解析

做这个考研社区项目是几个月前的事了。当时手头正好有一批学习者的需求&#xff0c;想做一个既能分享复习资料、又能互相答疑的考研帮平台。起初我以为这不过是一个“论坛换皮”&#xff0c;真正动手才发现&#xff0c;考研场景对学习交流生态圈的要求远比想象中多&#xff1a;…

作者头像 李华
网站建设 2026/10/17 9:13:47

金融服务平台核心架构:账户、支付与风控实践指南

1. 金融服务平台怎么拆&#xff1a;从大泥球到模块化做金融业务系统这几年&#xff0c;每次接到新项目都会先面对同一个问题&#xff1a;到底要不要把“大泥球”拆开。项目代号是financial-services&#xff0c;听起来是一个很正经的金融科技平台&#xff0c;实际上这类系统的通…

作者头像 李华
网站建设 2026/10/17 9:13:13

高斯滤波原理与实现:从数学推导到工程踩坑实录

1. 从"糊了"说起&#xff1a;高斯滤波到底在做什么很多人第一次接触高斯滤波&#xff0c;脑子里冒出来的第一个念头就是"这不就是把图片弄糊吗"。这个直觉其实没错&#xff0c;但只说对了一半。高斯滤波确实会让图像变模糊&#xff0c;但它做的是一件更精确…

作者头像 李华