将Docker的根目录迁移到其他挂载盘的详细流程
作者:代码怪兽大作战
在使用 Docker 的过程中,你是否遇到过类似问题:
“服务器磁盘告警,发现 /var/lib/docker 目录已经占用了 80G+ 的空间!”
Docker 默认将所有容器、镜像、数据卷等内容存放在 /var/lib/docker
下,随着业务增长,该目录很容易撑爆根分区。
本文将教你如何将 Docker 的根目录迁移到其他挂载盘(如 /opt/docker
),并保持原有容器、镜像、数据卷不丢失。
适用场景
/var/lib/docker
占用空间太大,影响系统运行- 服务器挂载了大容量的数据盘或独立磁盘目录(如
/opt
、/data
) - 想保持已有容器镜像数据不丢失
操作概览
推荐使用 rsync 安全迁移,并通过配置 data-root 修改 Docker 根目录
一、迁移前清理无用数据(推荐)
迁移前可以清理以下资源,减少磁盘占用和迁移时间:
- 已退出的容器
- 未使用的镜像(如
<none>
) - 构建缓存
- 未挂载的卷
磁盘使用情况命令:
du -h --max-depth=1 /var/lib/
推荐清理命令:
docker system prune -a --volumes
也可以按模块逐个清理:
docker container prune # 清理已退出容器 docker image prune -a # 删除悬空镜像 docker volume prune # 清理未使用的卷 docker network prune # 清理未使用的网络
注意事项:
清理操作不可恢复,请确保不再使用的资源才执行
清理前可用如下命令预览:
docker images -f dangling=true docker volume ls -f dangling=true docker ps -a
二、确认当前 Docker 根目录
docker info | grep 'Docker Root Dir'
输出示例:
Docker Root Dir: /var/lib/docker
三、停止 Docker 服务(必须)
迁移数据前必须停掉 Docker,避免文件写入不一致:
sudo systemctl stop docker
可选(有 containerd 的话):
sudo systemctl stop containerd
四、使用 rsync 安全复制 Docker 目录
推荐使用 rsync
,保持文件权限、符号链接等:
sudo rsync -aAXHv --progress /var/lib/docker/ /opt/docker/
参数说明:
参数 | 作用 |
---|---|
-aAXH | 保留文件权限、ACL、符号链接、硬链接等 |
--progress | 显示复制进度 |
/ 结尾 | 表示复制目录 内容 而不是目录本身 |
迁移完成:
五、修改 Docker 配置文件
编辑 /etc/docker/daemon.json
,添加或修改如下配置:
{ "data-root": "/opt/docker" }
如果该文件不存在,可直接创建。
六、重启 Docker 服务
sudo systemctl start docker
七、验证迁移是否成功
docker info | grep 'Docker Root Dir'
输出应为:
Docker Root Dir: /opt/docker
再执行:
docker ps -a docker images
确保容器、镜像、数据卷等一切正常。
八、清理旧目录(确认无误后)
要确认 Docker
是否仍在使用 /var/lib/docker
目录,可以从 配置检查 + 活动检查 + 挂载路径检查 三个层面来判断。
检查 Docker 当前数据目录配置
docker info | grep "Docker Root Dir"
例如输出:
Docker Root Dir: /opt/docker
- 如果显示为
/var/lib/docker
→ 说明仍在使用旧目录。 - 如果显示为其他路径(如
/opt/docker
)→ 说明已经迁移成功,Docker 正在用新路径。
确认 /var/lib/docker 是否还有文件被访问(实时检测)
可以使用以下方式来检测该目录是否仍在被 Docker 访问:
使用 lsof
查看是否有进程打开了该目录文件:
sudo lsof +D /var/lib/docker
- 如果输出很多项 → 有程序(很可能是 Docker)还在访问该目录。
- 如果无输出 → 当前没有任何进程使用
/var/lib/docker
。
或者查看是否有挂载点:
mount | grep /var/lib/docker
如果该路径有挂载(如 overlay、aufs、tmpfs 等),则说明仍然在使用。
使用 du 对新路径进行核查对比(判断是否数据已迁移)
假设你迁移到了 /opt/docker
:
sudo du -sh /opt/docker
- 如果
/opt/docker
显示接近 45G,说明迁移后的路径也包含完整数据; - 如果
/opt/docker
只有几百 MB,而/var/lib/docker
仍然 45G,那说明 Docker 还在用旧目录,或者迁移不完整。
查看 Docker 配置文件 daemon.json
cat /etc/docker/daemon.json
确认里面有如下配置,并且路径与你预期一致:
{ "data-root": "/opt/docker" }
如果此配置不存在,Docker 默认仍使用 /var/lib/docker
重启后再次确认(配置生效关键)
如果你修改了 daemon.json
但没有重启 Docker,旧路径可能仍被使用。
确保你执行了:
sudo systemctl restart docker
然后重新执行 docker info
确认是否已生效。
最终判断标准(是否可安全删除 /var/lib/docker
):
可以放心清理 /var/lib/docker
的前提条件:
条件 | 符合说明 |
---|---|
docker info 显示 Docker Root Dir 为新路径(如 /opt/docker) | ✅ |
lsof +D /var/lib/docker 无任何输出 | ✅ |
mount为空 | ✅ |
/opt/docker 占用空间基本等于 /var/lib/docker | ✅ |
所有容器、镜像、网络、卷运行无异常 | ✅ |
满足以上条件,就可以安全删除 /var/lib/docker。
数据验证无误后,可以删除旧目录释放磁盘空间:
sudo rm -rf /var/lib/docker
常见问题 FAQ
迁移过程中可以不停机吗?
不能。Docker 必须停止服务,否则正在运行的容器或镜像文件可能处于写入状态,迁移将造成数据不一致或损坏。
如果迁移失败,可以恢复吗?
完全可以。原目录 /var/lib/docker
没有删除前,可随时回退:
# 修改 daemon.json 改回原路径 { "data-root": "/var/lib/docker" } # 重启 Docker sudo systemctl restart docker
总结
通过合理迁移 Docker 根目录,可以有效释放根分区压力,将大量容器与镜像数据迁移到更大更合理的挂载路径上。
迁移核心步骤:
- 清理无用资源(推荐)
- 停止 Docker 服务
- 使用 rsync 拷贝数据
- 修改配置文件指向新目录
- 重启 Docker 并验证运行正常
- 删除旧目录释放空间
以上就是将Docker的根目录迁移到其他挂载盘详细流程的详细内容,更多关于Docker根目录迁移的资料请关注脚本之家其它相关文章!