docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Docker根目录迁移

将Docker的根目录迁移到其他挂载盘的详细流程

作者:代码怪兽大作战

Docker默认将所有容器、镜像、数据卷等内容存放在 /var/lib/docker 下,随着业务增长,该目录很容易撑爆根分区,所以本文将教你如何将 Docker 的根目录迁移到其他挂载盘并保持原有容器、镜像、数据卷不丢失,需要的朋友可以参考下

在使用 Docker 的过程中,你是否遇到过类似问题:

“服务器磁盘告警,发现 /var/lib/docker 目录已经占用了 80G+ 的空间!”

Docker 默认将所有容器、镜像、数据卷等内容存放在 /var/lib/docker 下,随着业务增长,该目录很容易撑爆根分区。

本文将教你如何将 Docker 的根目录迁移到其他挂载盘(如 /opt/docker,并保持原有容器、镜像、数据卷不丢失。

适用场景

操作概览

推荐使用 rsync 安全迁移,并通过配置 data-root 修改 Docker 根目录

一、迁移前清理无用数据(推荐)

迁移前可以清理以下资源,减少磁盘占用和迁移时间:

磁盘使用情况命令:

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 是否还有文件被访问(实时检测)

可以使用以下方式来检测该目录是否仍在被 Docker 访问:

使用 lsof 查看是否有进程打开了该目录文件:

sudo lsof +D /var/lib/docker

或者查看是否有挂载点:

mount | grep /var/lib/docker

如果该路径有挂载(如 overlay、aufs、tmpfs 等),则说明仍然在使用。

使用 du 对新路径进行核查对比(判断是否数据已迁移)

假设你迁移到了 /opt/docker

sudo du -sh /opt/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的根目录迁移到其他挂载盘详细流程的详细内容,更多关于Docker根目录迁移的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文