Docker Windows C盘爆满迁移到D盘:完整试错与成功路径

一份来自实战的 Docker Desktop for Windows 数据迁移指南


📌 一、问题背景

作为一名开发者,我在使用 Docker Desktop for Windows 时遇到了一个令人崩溃的问题:

C盘空间被 Docker 数据占满 💥

系统频繁提示空间不足,严重影响了日常开发工作。经过一番折腾,我终于找到了正确的迁移方法。在此分享我的试错历程,希望能帮助到遇到同样问题的朋友。


❌ 二、常见误区与失败尝试

误区 1:只修改 daemon.jsondata-root

json

复制代码
{
  "data-root": "D:\\DockerData"
}

结果:❌ 失败

原因
daemon.jsondata-root 只影响 Docker 引擎的数据目录,但 Docker Desktop 使用 WSL2 后端时,WSL 虚拟机数据仍然存储在默认位置:

text

复制代码
C:\Users\<用户名>\AppData\Local\Docker\wsl

误区 2:手动移动 WSL 目录

直接复制 wsl 目录到 D 盘,然后修改注册表。

结果:❌ 失败

原因

WSL2 的 ext4.vhdx 文件与系统绑定,手动移动会导致 Docker 无法启动。


误区 3:使用 WSL 命令迁移但不配置 Docker Desktop

powershell

复制代码
wsl --export docker-desktop D:\docker-desktop.tar
wsl --unregister docker-desktop
wsl --import docker-desktop D:\DockerData\wsl D:\docker-desktop.tar

结果:❌ 部分成功,但 Docker 仍会在 C 盘重建数据

原因

Docker Desktop 有自己的配置文件,需要同时修改。


✅ 三、正确的迁移步骤

步骤 1:备份重要数据

powershell

复制代码
# 备份 Docker 镜像示例
docker save homeassistant/home-assistant:latest -o D:\DockerData\homeassistant.tar

💡 提示:如果有多个重要镜像,请逐一备份。


步骤 2:关闭 Docker Desktop

右键托盘图标 → Quit Docker Desktop


步骤 3:通过 Docker Desktop 界面配置(🔥 最关键的一步)

  1. 打开 Docker Desktop → SettingsResourcesAdvanced

  2. 找到 Disk image location

  3. 点击 Browse ,选择 D:\DockerData\DockerDesktopWSL

  4. 点击 Apply & Restart

⚠️ 注意:请确保目标目录已提前创建好。


步骤 4:删除 C 盘旧数据

powershell

复制代码
# 删除 C 盘旧的 WSL 数据(请将 <用户名> 替换为你的实际用户名)
Remove-Item "C:\Users\<用户名>\AppData\Local\Docker\wsl" -Recurse -Force

步骤 5:验证迁移结果

powershell

复制代码
# 检查 WSL 状态
wsl --list --verbose

# 验证 Docker 是否正常工作
docker run --rm hello-world

📁 四、关键配置文件说明

1. Docker Desktop 配置文件

路径%APPDATA%\Docker\settings-store.json

json

复制代码
{
  "CustomWslDistroDir": "D:\\DockerData\\DockerDesktopWSL",
  "SettingsVersion": 43
}

2. Docker Engine 配置文件

路径%USERPROFILE%\.docker\daemon.json

⚠️ 重要 :WSL2 模式下,不要设置 data-root,否则会导致容器无法启动!

json

复制代码
{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false
}

🔧 五、常见问题排查

问题 1:容器启动失败

错误信息

text

复制代码
invalid rootfs: stat /run/desktop-containerd/daemon/.../D:\DockerData/rootfs/...: no such file or directory

解决方案

删除 daemon.json 中的 data-root 配置,然后重启 Docker Desktop。


问题 2:WSL 位置未更新

解决方案

检查 settings-store.json 中的 CustomWslDistroDir 路径是否正确。


问题 3:C 盘空间仍不足

解决方案

手动删除旧的 WSL 目录后,如果没有立即释放空间,可以试试:

powershell

复制代码
# 以管理员身份运行
Optimize-VHD -Path "C:\Users\<用户名>\AppData\Local\Docker\wsl\disk\*.vhdx" -Mode Full

或者使用 Windows 自带的"磁盘清理"工具。


🔍 六、验证方法

powershell

复制代码
# 1. 检查 WSL 分发版位置
Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss\*" | 
  Where-Object { $_.DistributionName -like "*docker*" } | 
  Select-Object DistributionName, BasePath

# 2. 验证 Docker 运行
docker run --rm hello-world

# 3. 检查 C 盘剩余空间
Get-Volume -DriveLetter C | 
  Select-Object FreeSpace, Size

📊 七、总结与建议

🎯 成功要点

要点 说明
✅ 使用 Docker Desktop 界面配置 这是最可靠的迁移方式
✅ 不要手动修改 data-root WSL2 模式下会导致冲突
✅ 及时清理旧数据 迁移完成后手动删除 C 盘旧目录

🛡️ 预防措施

1. 定期清理无用镜像和容器

powershell

复制代码
docker system prune -a

2. 开启 Docker 的 GC 功能

json

复制代码
{
  "builder": {
    "gc": {
      "enabled": true,
      "defaultKeepStorage": "20GB"
    }
  }
}

3. 设置镜像自动清理策略(可选)


📈 八、迁移结果展示

项目 迁移前 迁移后
WSL 位置 C:\Users\...\Docker\wsl D:\DockerData\DockerDesktopWSL
C 盘释放空间 --- ~5GB
Docker 状态 ❌ C 盘爆满 ✅ 正常运行

💬 写在最后

这次迁移经历让我深刻体会到:

面对技术问题时,不要盲目尝试,要先理解原理

Docker Desktop 的 WSL2 后端有其独特的存储机制,只有通过官方提供的配置方式才能正确迁移。

希望这篇文章能帮到你!如果有问题,欢迎在评论区留言讨论。


🔗 参考链接


<div align="center">

👍 点赞 | ⭐ 收藏 | 👀 关注

你的支持是我创作的动力!🚀

</div>

相关推荐
小森林之主1 天前
Docker Compose 紧急救援:凌晨3点服务器报警的解决方案
docker·微服务·容器化·docker compose·故障排除
剪刀石头布Cheers1 天前
NDM浏览器插件无法连接后台的问题
windows·端口冲突·ndm
杨了个杨89821 天前
Docker Compose 简介及应用
运维·docker·容器
豆瓣鸡1 天前
XXL-JOB 定时任务——从 Docker 部署到分片广播,分布式任务调度落地
spring boot·分布式·docker·定时任务
Re_Virtual1 天前
基于web的轻量级http测试工具——Restfox
http·docker·开源·restfox
PiaoShiSun1 天前
Windows环境下批量删除文件夹内仅有1个/2个/*个文件的文件夹
windows·批量删除单文件的文件夹
足球中国1 天前
nuget把缓存搬离C盘
c语言·windows·缓存
java_logo1 天前
Docker 部署 Home Assistant:在群晖 NAS 或 Linux 上打造家庭智能中枢
linux·docker·容器·homeassistant·轩辕镜像·homeassistant部署·homeassistant教程
极客先躯1 天前
高级java每日一道面试题-2026年04月18日-实战篇[Docker]-如何处理金融行业的时序数据容器化?
java·运维·docker·容器·金融·时序数据·高级面试