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

 更新时间:2025年08月01日 10:47:19   作者:代码怪兽大作战  
Docker默认将所有容器、镜像、数据卷等内容存放在 /var/lib/docker 下,随着业务增长,该目录很容易撑爆根分区,所以本文将教你如何将 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根目录迁移的资料请关注脚本之家其它相关文章!

相关文章

  • docker运行nginx容器并挂载数据卷

    docker运行nginx容器并挂载数据卷

    本文主要介绍了docker运行nginx容器,并通过挂载目录将容器与宿主机的数据进行共享和统一管理,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • 详解Docker容器可视化监控中心搭建

    详解Docker容器可视化监控中心搭建

    本篇文章主要介绍了详解Docker容器可视化监控中心搭建,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 使用Docker搭建Java环境的步骤方法

    使用Docker搭建Java环境的步骤方法

    本篇文章主要介绍了使用Docker搭建Java环境的步骤方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • Gogs+Jenkins+Docker 自动化部署.NetCore的方法步骤

    Gogs+Jenkins+Docker 自动化部署.NetCore的方法步骤

    这篇文章主要介绍了Gogs+Jenkins+Docker 自动化部署.NetCore,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • centos下docker安装及springboot远程发布docker的方法

    centos下docker安装及springboot远程发布docker的方法

    这篇文章主要介绍了centos下docker安装及springboot远程发布docker的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 解决docker使用GDB,无法进入断点的问题

    解决docker使用GDB,无法进入断点的问题

    这篇文章主要介绍了解决docker使用GDB,无法进入断点的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • docker批量加载镜像的方法实现

    docker批量加载镜像的方法实现

    通常我们批量加载docker镜像文件的时候,通常会写一个shell文件,本文就来介绍一下史上最简单批量加载docker镜像的方法,感兴趣的可以了解一下
    2023-12-12
  • Docker部署Django应用的示例

    Docker部署Django应用的示例

    这篇文章主要介绍了Docker部署Django应用的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Docker和宿主机之间如何共享文件

    Docker和宿主机之间如何共享文件

    这篇文章主要介绍了Docker和宿主机之间如何共享文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 在docker中运行mariadb程序的方法

    在docker中运行mariadb程序的方法

    这篇文章主要介绍了在docker中运行mariadb程序的方法,首先大家先安装docker,然后在进行相应的操作,具体内容详情大家参考下本文
    2018-05-05

最新评论