Docker Desktop WSL 2 数据迁移:从 C 盘搬家到其他盘

Docker Desktop WSL 2 数据迁移:从 C 盘搬家到其他盘 背景Docker Desktop版本 29.6.2 在 Windows 上使用 WSL 2 后端时数据默认存储在C:\Users\用户名\AppData\Local\Docker\wsl\disk\docker_data.vhdx这是一个虚拟磁盘文件随着使用会膨胀到几十 GB。C 盘吃紧时需要把它迁移到其他盘。以下路径均为示例实际操作换成你自己的目标目录即可。核心事实这是两件独立的事Docker Desktop 的数据迁移涉及两个独立的机制它们之间没有依赖关系按需选择即可机制管理什么大小是否需要迁移WSL distro(docker-desktop)Docker 引擎运行环境~100MB通常不需要数据磁盘(docker_data.vhdx)镜像、容器、volume 数据几十 GB这是重点第一件事迁移 WSL distro可选通常没必要wsl --shutdown wsl --export docker-desktop target-dir\data.tar wsl --unregister docker-desktop wsl --import docker-desktop target-dir\ target-dir\data.tar --version 2这是做什么把 Docker 引擎的 WSL 分发docker-desktop迁移到目标盘。要不要做通常没必要。100MB 对 C 盘压力微乎其微不值得折腾。除非你有洁癖或者 C 盘真的寸土寸金。而且新版本如29.6.2执行迁移镜像/容器数据时清除为什么导出的是 tarwsl --export的默认输出格式就是 tar这是 WSL 设计的通用备份/交换格式。WSL 较新版本支持--vhd参数直接导出 vhdx但默认行为仍是 tar。迁移完成后可以删掉data.tarWSL 会在导入目录生成内部的存储文件。第二件事迁移镜像/容器数据这才是重点实际行为在 Docker Desktop GUI 中Settings → Resources → Advanced → Disk image location点击Browse选择target-dir例如E:\Program\Docker点击Apply Restart。Docker 会自动在指定的目录下创建DockerDesktopWSL\disk\结构并迁移现有数据指定的路径: E:\Program\Docker 实际创建的结构: E:\Program\Docker\ └── DockerDesktopWSL\ ├── disk\ │ └── docker_data.vhdx ← 镜像/容器数据这才是大头注意1.Docker 不会直接在指定的目录下放文件而是强制套层DockerDesktopWSL\disk\。2.不同 Docker Desktop 版本行为可能不同。建议数据迁移前备份如果迁移后数据不完整可以手动关闭 Docker Desktop将旧的docker_data.vhdx复制到新位置覆盖再启动。文件对照文件/目录来源说明迁移后能否删data.tar第一件事的导出备份WSL 通用交换格式可以删docker_data.vhdx第二件事的数据磁盘镜像/容器/卷数据大头保留C 盘log/、run/等Docker Desktop 运行必需含 lock 文件不建议删常见误区❌ 误区 1做了第一件事就等于迁移了数据wsl --export/import docker-desktop只迁移了引擎 distro100MB不含镜像数据。镜像数据在docker_data.vhdx里必须通过第二件事GUI 改 Disk image location才能搬走。❌ 误区 2两件事必须配合做它们是独立机制。只做第二件事GUI 改路径就能解决 C 盘空间问题同时解决引擎那 100MB。在新版本第一件事是可以不做但旧版本可能仍需做。❌ 误区 3docker-compose 能控制镜像存储位置docker-compose 只决定用什么镜像、端口映射、volume数据卷 挂载。Docker 的镜像层、容器层存储在哪儿由 Docker Daemon 的 Disk image location 决定compose 管不了。❌ 误区 4用目录联接junction/symlink替代官方迁移虽然mklink /J在文件系统层面可以把目录指向另一个位置但 Docker Desktop 的数据路径由 WSL2 和 Docker 内部管理不保证能正确解析 junction。社区有报告 symlink 在 WSL/Windows 互操作中的兼容性问题用 junction 替代官方迁移方式存在不确定性不建议尝试。附录Volume 挂载走另一条路虽然镜像存储位置由Disk image location控制但应用数据如 MySQL 表文件可以用 bind mount 放到指定目录services:mysql:image: mysql:8volumes:- your-data-dir:/var/lib/mysql这样镜像本身在 vhdx 里数据库文件在你指定的目录各管各的。注意这里只推荐用Bind Mount直接映射宿主机目录。有一种Named Volume driver_opts强制指定路径的写法本质上是给 Bind Mount 套了一层 Named Volume 的壳增加了复杂度却没有带来实质收益不建议使用。如果确实需要 Docker 管理 volume 生命周期就用纯 Named Volume不指定路径让 Docker 自行管理如果需要控制数据存放路径直接用 Bind Mount 即可。创作不易禁止抄袭转载请附上原文链接及标题