自从开始用 WSL2 跑 DockerC 盘空间就见鬼一样地往下掉。一开始以为是镜像下多了清理几次发现根本治标不治本后来查了才发现问题出在根子上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 locationDocker 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 24.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 用管理员 PowerShellOptimize-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,umask22,fmask11但真正的容量限制得靠 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 网络、代理配置重启 DockerC 盘空间没减少旧的 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 文件回滚其实非常快。步骤如下退出 Docker Desktop托盘右键 Quit。执行wsl --shutdown。注销当前的 docker-desktop-datawsl --unregister docker-desktop-data。用备份的 tar 包重新导入到原来的 C 盘路径wsl --import docker-desktop-data C:\Users\你的用户名\AppData\Local\Docker\wsl\data D:\DockerBackup\wsl-backup\docker-desktop-data.tar --version 2。启动 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, {NameSizeGB;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 盘挪出去少走一段我当初反复折腾的弯路。