☰
Docker迁移到D盘:彻底释放C盘空间的完整指南
2026/10/15 5:01:16 网站建设 项目流程

如果你正在为 C 盘变红而头疼,那 Docker 很有可能是“元凶”之一。很多安装和配置 Docker 的教程都默认把数据放在系统盘,却没告诉你镜像、容器和数据卷加起来能膨胀到几十 GB。这篇文章就专门解决一个非常具体的需求:把 Docker 装到其他盘,并把镜像、容器数据也整体迁到其他盘,让 C 盘彻底解脱。Windows 上用 Docker Desktop 的、Linux 服务器上跑 Docker 的,都能找到对应的操作路径。

我会按“先搞清楚数据存哪、再决定迁移方案、最后动手实操”的顺序来写,每一步都会给出命令、参数含义和验证方式。你不需要提前懂 Docker 底层原理,跟着做就行,但读完它你至少能明白为什么平时 C 盘会长胖,以及以后怎么避免。

1. 先搞清楚 Docker 的数据到底放哪,才不会白忙

1.1 镜像、容器和数据卷:谁才是 C 盘空间的“大户”

很多人以为把 Docker 安装目录换到 D 盘就万事大吉,这其实是最大的误区。Docker 安装后的程序文件本身只有几百 MB,真正吃空间的是三样东西:镜像、容器层和数据卷。

镜像可以通俗地理解成“压缩包+系统快照”,每拉取一个镜像,它都会被展开成多层图层存放在 Docker 的数据目录里。容器运行时的读写层在容器停止后依然保留,也会占用空间。数据卷则是你自己挂载进去的持久化数据,数据库文件、日志文件、上传的附件等,全都算在这一类里。这三类累计下来,随便跑几个服务就能轻松吃掉 20~50 GB。

在 Linux 上,Docker 默认的数据根目录是/var/lib/docker,所以系统盘是重灾区。而在 Windows 的 Docker Desktop 中,情况进一步“隐蔽化”:Docker 会把整个数据目录封装进一个虚拟磁盘文件(.vhdx),这个文件默认存放在系统盘的用户目录下。你看到 C 盘多出来的是一整个几 GB 到几十 GB 的大文件,删也不是、挪也不是,非常尴尬。

1.2 安装目录和数据目录:这两个位置别搞混

“装在其他盘”这句话至少有两层含义:第一层是 Docker 程序本身装在 D 盘,第二层是 Docker 的数据根目录在 D 盘。我这里必须强调:程序装在哪只影响启动文件的物理位置,影响不了数据膨胀。真正让你的 C 盘爆满的,永远是数据根目录。

在 Windows 上,Docker Desktop 默认使用 WSL2 作为后端。它会在 WSL2 里注册两个发行版,一个负责跑 Docker 引擎,另一个专门存放镜像和容器数据。这两个发行版的虚拟磁盘文件(ext4.vhdx)默认被创建在系统盘的用户目录下。所以 Windows 用户迁移的重点就是把这两个 vhdx 文件从 C 盘移到 D 盘,然后再让 Docker Desktop 认新的位置。

Linux 用户反而简单:只需修改 Docker 守护进程的配置,把>wsl --status

如果提示内核版本过旧或者未安装,先运行:

wsl --update

把 WSL2 内核更新到最新版。这里我不展开讲功能怎么开,因为到安装 Docker 的那一步,Docker Desktop 会引导你完成剩余的系统组件初始化。只要虚拟化开了、系统版本够新、WSL2 内核能正常运行,后面的迁移操作就不会被系统层面的问题卡住。

3. Windows 安装 Docker 并搬到 D 盘:两条路线一次讲清

3.1 第一步:把 Docker 桌面程序安装到 D 盘

很多人在图形安装界面里找“自定义安装路径”按钮,找半天找不到。实际上 Docker Desktop 把安装路径参数设计成了命令行参数,图形界面默认直接安到 C 盘。

以管理员身份打开 PowerShell,进入 Docker Desktop 安装包所在的目录,然后执行:

.\DockerDesktopInstaller.exe install --installation-dir="D:\Docker" --backend=wsl-2

这个命令的核心作用有两个:--installation-dir指定程序文件安装到D:\Docker,--backend=wsl-2明确使用 WSL2 后端。如果你下载到的安装包版本比较旧,不支持--backend参数,去掉它即可,默认就是 WSL2。安装结束后,Docker Desktop 一般不自动启动,需要你手动点开,或者之后执行D:\Docker\Docker Desktop.exe。

这里要注意:安装目录换到 D 盘只是第一步,它解决的是“程序文件不占 C 盘”,但 Docker 的镜像数据仍然会通过 WSL2 虚拟磁盘继续占用 C 盘。如果你什么后续操作都不做,C 盘迟早还是会被吃满。所以接下来才是真正的重头戏。

3.2 全新安装场景:先写 .wslconfig 再装 Docker

如果你是刚准备装 Docker,还没跑过任何镜像,那强烈建议用这个方案:在一开始就通过.wslconfig文件把 WSL2 虚拟磁盘的根路径改到 D 盘。

先关闭所有 WSL 会话,然后找到当前用户的.wslconfig文件。路径是:

C:\Users\你的用户名\.wslconfig

如果文件不存在,就新建一个纯文本文件。写入如下内容:

[wsl2] basePath=D:\WSL memory=6GB processors=4

这里的basePath是关键参数,它决定了 WSL2 所有发行版虚拟磁盘文件的存放目录。以后 Docker Desktop 创建docker-desktop和docker-desktop-data这两个发行版时,对应的 vhdx 文件都会自动出现在D:\WSL下,C 盘从一开始就不会被波及。

写完保存后,执行:

wsl --shutdown

让配置生效。然后正常安装 Docker Desktop 即可。安装完不要急着跑,先到D:\WSL目录看一眼:你会发现那里已经生成了发行版文件夹,每个文件夹里面都是几十 MB 到几个 GB 的 vhdx 文件。这就是 Docker 真正的“数据仓库”,它已经成功落在 D 盘上了。

这个方法之所以好用,是因为它从根上解决了“默认倾向 C 盘”的问题。后续 Docker 数据怎么增长,C 盘都始终干净。缺点则在于它只适用于全新安装——如果你的 Docker 已经跑了一段时间、数据已经在 C 盘了,那就得看下一种路线。

3.3 已有数据场景:导出、注销、导入三步迁移

如果你的 Docker Desktop 已经使用了一段时间,C 盘里已经积累了镜像和容器数据,那就得走 WSL 发行版的导出导入流程。这就像搬家:先打包、搬走、再解包。

第一步,退出 Docker Desktop。右键系统托盘里的 Docker 图标,选退出。最好再确认一下后台没有残留进程,可以用任务管理器检查名为 Docker Desktop 和 com.docker.backend 的进程,有的话手动结束。

第二步,执行wsl --shutdown,彻底停止所有 WSL 发行版。

第三步,查看当前 Docker 注册了哪些 WSL 发行版:

wsl -l -v

输出里一般会看到两个和 Docker 相关的名字:docker-desktop和docker-desktop-data。其中docker-desktop-data是存储镜像、容器、卷的发行版,是整个迁移的核心;如果你看到的新版本 Docker 只有一个docker-desktop,那就迁移它。

把数据导出成一个 tar 备份文件:

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

导出时间取决于数据量,20GB 的数据大概要等几分钟到十几分钟。导出完成后,注销旧的发行版:

wsl --unregister docker-desktop-data

注销会让 WSL 删除这个发行版在 C 盘上的虚拟磁盘文件。这时你会发现 C 盘瞬间多出一大块空间,但别高兴太早,你的镜像数据现在全在 tar 包里。

把导出文件导入到 D 盘的新位置:

wsl --import docker-desktop-data D:\Docker\wsl D:\docker-backup\desktop-data.tar --version 2

这个命令的意思是:把desktop-data.tar导入到D:\Docker\wsl目录下,生成一个新的发行版,版本固定为 WSL2。导入完成后,D:\Docker\wsl下就会有一个新的 ext4.vhdx 文件。

最后重新启动 Docker Desktop。启动过程中它会自动重新注册并连接这个迁移后的发行版。启动完成后,随便跑一个docker ps或docker images,只要能正常输出,就说明迁移成功。

如果导入后 Docker Desktop 无法启动,多半是和发行版的注册信息冲突有关。先执行wsl --shutdown,再重新打开 Docker Desktop,基本能解决。千万不要在启动失败时反复直接删除 vhdx 文件,那会让数据全部丢失。

3.4 迁移完怎么确认 C 盘真的没再变大

迁移是不是成功,不能只看 D 盘多了一个文件夹,得从三个维度验证。

第一维,看发行版注册信息。执行:

wsl -l -v

确认 Docker 相关的发行版状态是 Default 或 Running。再用文件管理器看D:\WSL或D:\Docker\wsl里的 vhdx 文件是否存在、体积是否合理。

第二维,看 Docker 的数据根目录。在终端里执行:

docker info

输出信息里有一行Docker Root Dir。在 WSL2 模式下,这行通常会显示 WSL 发行版内部的路径,比如/var/lib/docker,这属于正常现象。它体现的是发行版内的路径,而不是物理路径。真正的物理路径要看 vhdx 文件的位置,也就是第一步里确认的内容。

第三维,也是最直观的验证:记录当前 C 盘剩余空间,拉取一个镜像测试。比如执行:

docker pull hello-world

然后再次观察 C 盘剩余空间,如果几乎没波动,说明数据写入已经全部发生在 D 盘。如果发现 C 盘依然在减少,说明还有别的缓存路径在作怪,这部分我放在后面常见问题里专门说。

4. Linux 服务器迁移 Docker 数据目录:修改>{ "data-root": "/data/docker" }

>sudo systemctl restart docker

这里有个细节:如果你直接重启 Docker,系统会在新配置的/data/docker下创建一套全新的空数据目录,原来/var/lib/docker里的镜像、容器全都不见了。所以不能只改配置,必须先把旧数据整体转移过去。

4.2 从零迁移现有数据:先复制再切换

完整迁移流程我用下面这几步总结,每一步都不要乱序。

第一步,停止 Docker 服务:

sudo systemctl stop docker

这一步非常关键,停止服务是保证数据一致性的前提。如果 Docker 还在运行,文件系统里的数据可能处于写入中,复制过去会有损坏风险。

第二步,把旧数据完整复制到新目录。推荐用 rsync 而不是 cp,因为 rsync 能保留权限、属主和扩展属性,还支持断点续传,适合大数据量复制:

sudo rsync -avxP /var/lib/docker/ /data/docker/

解释一下这几个参数:-a表示归档模式,保留权限、符号链接和时间戳;-v显示详细输出;-x限定不跨文件系统边界,防止意外递归挂载点;-P显示进度并支持文件中断后恢复。路径末尾的斜杠是有讲究的,源路径带斜杠表示复制目录内容,目标路径带斜杠表示写入目标目录本身,这样最终/data/docker里直接就是 Docker 的数据文件。

第三步,新建或修改/etc/docker/daemon.json,写入>sudo systemctl start docker

第五步,验证数据是否被正确加载:

docker info | grep "Docker Root Dir"

看到输出变为/data/docker就说明切换成功。再用docker images看你以前的镜像是否全部还在。如果这些命令都正常,就可以把旧的/var/lib/docker目录清理掉了。不建议立刻删除,先保留几天,确认新目录运行稳定再回收空间。删除时用:

sudo rm -rf /var/lib/docker

注意这一步会永久删除旧数据目录,确认容器都能正常启动后再执行。

4.3 顺手把容器日志也限制一下

很多 Linux 服务器遇到的系统盘爆满问题,除了镜像数据,还有一个隐藏帮凶:容器日志。容器运行时的标准输出日志会以 json 格式文件存进容器目录下,默认不限制大小,一个日志写几个 GB 的情况非常常见。迁移>{ "data-root": "/data/docker", "log-driver": "local", "log-opts": { "max-size": "10m", "max-file": "3" } }

max-size控制单个日志文件的最大体积,超过后自动轮转;max-file控制最多保留几个轮转文件。配成 10MB、3 份,意味着单个容器的日志最多占 30MB,这能有效避免日志无限制膨胀下去。

需要留意的是,这个配置只对修改之后新建的容器生效,已经存在的容器不会回溯。要让已有容器也生效,需要重建容器,或者连同数据目录迁移一起做。如果你正好要迁移 Docker 数据目录,那就在迁移完成后的某个可控窗口里重建所有容器,日志问题可以一并解决。

5. 常见故障排查与避坑经验

5.1 Docker Desktop 启动失败时的排查顺序

Docker Desktop 在迁移 WSL 发行版之后启动失败,这类问题出现的概率不低。先不要慌,绝大多数情况都能在几步内修复。

先检查 WSL 发行版本身是否正常,执行:

wsl -l -v

如果输出中 Docker 相关的发行版存在且状态正常,排查方向转向 Docker Desktop 进程。打开任务管理器,结束所有 Docker 相关进程,再执行wsl --shutdown,最后重新启动 Docker Desktop。

如果wsl -l -v里根本没有 Docker 相关发行版,说明导入没有成功。检查导入命令里的目标路径是否有权限问题,或者旧发行版注销后残留的注册信息干扰了新导入。可以尝试用管理员 PowerShell 再执行一次wsl --shutdown,然后重新导入。

还有个小概率情况:导入过程中 tar 包已经损坏。这种情况多见于备份盘空间不足,导出中断。所以迁移前一定要确认备份盘容量,导出文件生成后可以先查看文件大小,如果远小于预期,很可能已经中断,不要拿这种文件去导入。

5.2 明明迁移了,C 盘怎么又悄悄变小

迁移之后如果你发现 C 盘还是持续减少,最大的嫌疑有两个。

第一个是%LOCALAPPDATA%\Docker目录。Docker Desktop 除了 WSL 发行版数据,还会在系统盘缓存一些程序运行数据、自动更新包和临时文件。尤其是自动更新,下载的新版本安装包会暂存在系统盘,更新完成后有时不会自动清理。

第二个是 WSL2 发行版并没有 100% 把 vhdx 文件放在 D 盘。你可以用搜索命令检查:

Get-ChildItem -Path C:\Users\你的用户名\AppData\Local -Recurse -Filter *.vhdx -ErrorAction SilentlyContinue

如果找到 Docker 相关的 vhdx 文件仍然在 C 盘,说明之前迁移的发行版不对,或者 Docker Desktop 更新后又创建了新发行版。这时候只能重新走一遍 export/import 流程,把新产生的 vhdx 也迁过去。

针对 Docker Desktop 自动更新造成的“反复横跳”,我的经验是:迁移完成后在 Docker Desktop 的设置里关闭自动更新,手动选择更新时机。这样你就不会在不知情的情况下被更新包重新“种”一份数据到 C 盘。

5.3 导出 tar 体积太大、备份盘不够放怎么办

WSL 的wsl --export导出的 tar 文件没有压缩,体积等于 vhdx 里已使用数据量,也就是“实际数据体积”。一个 40GB 的虚拟磁盘,导出出来的 tar 可能也是 40GB。如果你的中间备份盘放不下,可以换个思路。

方案一:使用新版本 WSL 支持的导出方式:

wsl --export docker-desktop-data D:\docker-backup\desktop-data.vhdx --vhd

只导出虚拟磁盘文件本身,不转成 tar。vhdx 文件自带压缩机制(未使用的空间是稀疏的),通常比 tar 小很多。后续导入时同样用--import配合参数。不过这个功能依赖 WSL 版本,不是所有系统都支持,如果命令报错说明版本不够,需要先wsl --update。

方案二:不要执着于导出,直接操作 vhdx 文件。先wsl --shutdown,然后手动把 C 盘用户目录下 Docker 相关的 vhdx 文件剪切到 D 盘对应位置。这个办法要控制好权限,最好提前退出 Docker 和所有 WSL 进程,因为直接移动文件系统级文件有一定风险,操作不当会导致发行版无法启动。

整体来说,最省心的方案还是“从一开始就写好 .wslconfig”,让虚拟磁盘文件永远不落在 C 盘上。已经入坑的用户也别难受,迁移一次之后,以后的新数据就都规规矩矩在 D 盘了。

5.4 几个我踩过之后不想让你踩的坑

第一个坑:不要等 C 盘完全红透才想起来迁移。导出 tar 需要空间,导入 vhdx 需要空间,迁移过程中新旧两份数据同时存在,需要的临时空间比想象中大得多。我见过有人 C 盘只剩 2GB,导出到一半就中断,旧数据还差点损坏。提前规划,至少留出总数据量 1.5 倍的可用空间。

第二个坑:不要把 vhdx 文件放到 FAT32 或 exFAT 的移动盘上。虚拟磁盘需要随机读写和文件空洞支持,FAT32 对大文件不友好,exFAT 虽然能放单文件超 4GB,但存在性能问题。目标分区一定用 NTFS 或 Linux 下的 ext4/xfs。

第三个坑:迁移完成后的第一次启动,不要直接马上跑压测和批量导入。先跑一个最小镜像测试,比如docker run hello-world,确认容器能创建、能删除,再逐步恢复你的服务。这样就算有问题,排查范围也小很多。

第四个坑:定期清理无用镜像和悬空数据。迁移只是把空间问题转移到了 D 盘,不代表 D 盘永远够用。养成习惯,每隔一段时间执行一次:

docker system prune

Docker 会把停止的容器、无用的网络、悬空镜像全部清掉,改挂载卷的数据不会误删。不需要的镜像被清走后,D 盘压力会小很多,C 盘自然就更安全。

最后分享一个我个人的使用习惯:在新机器上,我永远是先写.wslconfig,把basePath指到 D 盘,再装 Docker Desktop。已经跑起来的机器,就用 export/import 迁移一次。迁移完顺手关掉 Docker Desktop 的自动更新,再配好daemon.json的日志限制。这套组合拳打下来,之后再也没为 Docker 空间问题头疼过。

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

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

立即咨询