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>

相关推荐
拄杖忙学轻声码2 小时前
Docker Swarm 集群部署应用容器常见问题解决
docker·容器
这是程序猿2 小时前
mysql的安装教程
java·人工智能·windows·mysql
爱学习的小囧2 小时前
VMware ESXi 双管理网口配置全教程:新增 vmk1 端口 + 主备冗余 / 负载均衡双模式实操
运维·服务器·网络·windows·负载均衡·虚拟化
小夏子_riotous2 小时前
Docker学习路径——7、Docker搭建MySQL 主从复制
linux·运维·mysql·docker·容器·centos·云计算
liyinchi19882 小时前
Windows Server 部署Docker Engine
运维·docker·容器
郝开3 小时前
Docker Compose 本地环境搭建:.env 统一配置模板
运维·docker·容器
xiaoshuaishuai83 小时前
【无标题】
开发语言·windows·c#
王江奎3 小时前
Windows 跨平台 C/C++ 项目中的 UTF-8 路径陷阱
c++·windows·跨平台
minji...3 小时前
Linux 网络套接字编程(三)UDP服务器与客户端实现:Windows与Linux通信,新增字典翻译功能的 UDP 通信
linux·服务器·开发语言·网络·windows·算法·udp