Docker 数据目录迁移的实现步骤

 更新时间:2025年12月03日 09:18:26   作者:Chen_Curry  
本文详细记录了将Docker数据目录从/var/lib/docker迁移到更大容量的分区的全过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

在使用 Docker 过程中,默认数据目录 /var/lib/docker 会存储镜像、容器、卷等所有核心数据。随着业务增长,该目录所在的 /var 分区可能因空间不足面临扩容压力,此时将 Docker 数据目录迁移到更大容量的分区(如本文中的 /data2/docker/data)是最优解决方案。本文将详细记录从准备工作、数据复制、配置修改到问题排查的完整迁移过程,包含实操命令和避坑指南,适用于 Ubuntu 及其他 Linux 发行版。

一、迁移前准备

1. 环境确认

  • 操作系统:Ubuntu 22.04.5 LTS
  • Docker 版本:28.2.2(客户端与服务端版本一致)
  • 源数据目录:/var/lib/docker(默认路径,通过 docker info | grep "Docker Root Dir" 确认)
  • 目标数据目录:/data2/docker/data(需确保目标分区有足够空间,本文迁移数据量约 260G)

2. 核心工具与命令

  • systemctl:管理 Docker 服务启停
  • cp -a:完整复制目录(保留权限、隐藏文件、元数据)
  • nano:编辑 Docker 配置文件
  • journalctl:查看 Docker 启动日志(排查错误)

3. 关键前提

  • 迁移前必须停止 Docker 服务及相关进程,避免数据写入导致复制不完整
  • 目标目录需提前创建并配置正确权限,确保 Docker 可读写

二、详细迁移步骤

步骤 1:停止 Docker 服务(关键!)

Docker 运行时会持续读写数据目录,迁移前需完全停止服务,同时停止 docker.socket 防止自动激活:

# 停止 Docker 服务
sudo systemctl stop docker
# 停止 docker.socket(避免服务被自动激活)
sudo systemctl stop docker.socket
# 验证状态(均显示 inactive (dead) 即为成功)
sudo systemctl status docker
sudo systemctl status docker.socket

步骤 2:创建目标目录并配置权限

目标目录需归属 root 用户(Docker 运行用户),权限设置为 701(与默认目录权限一致):

# 创建目标目录(-p 确保父目录递归创建)
sudo mkdir -p /data2/docker/data
# 配置所有者为 root:root
sudo chown -R root:root /data2/docker/data
# 配置权限(保证 root 读写权限,其他用户可执行)
sudo chmod -R 701 /data2/docker/data

步骤 3:完整复制数据到目标目录

使用 cp -a 命令复制数据,核心是保留所有文件属性和隐藏内容(Docker 依赖大量隐藏元数据文件):

# 关键命令:复制源目录下所有内容(包括隐藏文件和子目录)
sudo cp -a /var/lib/docker/. /data2/docker/data/

命令说明:

  • 源路径使用 /var/lib/docker/. 而非 /** 会忽略隐藏文件(如 overlay2 存储驱动的 .lower 元文件),导致数据不完整;/. 会复制目录下所有内容,包括隐藏文件和嵌套子目录
  • -a 选项等价于 -dR --preserve=all,递归复制、保留符号链接、权限、所有者、时间戳,确保数据完整性

步骤 4:修改 Docker 配置文件(指定新数据目录)

Docker 通过 /etc/docker/daemon.json 配置数据目录,需添加 data-root 字段指定新路径:

# 编辑配置文件(不存在则自动创建)
sudo nano /etc/docker/daemon.json

正确配置内容(JSON 格式严格!):

{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://mirror.ccs.tencentyun.com",
    "https://dockerproxy.com"
  ],
  "ipv6": false,
  "dns": ["x.x.x.x", "xxx.xxx.xxx.xxx"],
  "data-root": "/data2/docker/data"  // 核心:指定新数据目录
}

配置注意事项:

  • JSON 格式必须严格:键值对用逗号分隔,最后一个键值对后无多余逗号
  • 字符串不能包含换行符、多余引号,否则会导致 Docker 解析失败
  • 若原有配置包含镜像源、DNS 等,直接新增 data-root 字段即可,无需修改其他配置

步骤 5:启动 Docker 服务并验证

# 启动 Docker 服务(自动拉起 docker.socket)
sudo systemctl start docker
# 验证服务状态(显示 active (running) 即为成功)
sudo systemctl status docker
# 验证新数据目录是否生效
docker info | grep "Docker Root Dir"

预期输出:

Docker Root Dir: /data2/docker/data

三、迁移过程中遇到的问题与解决方案

问题 1:误触回车键是否影响复制?

现象:

执行 sudo cp -a /var/lib/docker/. /data2/docker/data/ 后等待迁移时,误触回车键。

结论:

完全不影响!

  • 第一次回车已启动 cp 复制进程,该进程独立运行,不受后续空输入干扰
  • 后续回车键仅向终端输入空行,终端会忽略无意义输入,不会中断或修改复制行为

验证方法:

# 查看 cp 进程是否正在运行
ps aux | grep cp
# 查看 IO 负载,确认数据传输中
sudo apt install -y iotop
sudo iotop -o  # 显示正在进行 IO 操作的进程

问题 2:Docker 启动失败,日志提示invalid character '\n' in string literal

现象:

执行 sudo systemctl start docker 失败,日志显示配置文件解析错误。

原因:

/etc/docker/daemon.json 存在 JSON 语法错误,具体为:

  • registry-mirrors 数组结束后多了多余的逗号和双引号(],"
  • 字符串中包含非法换行符

解决方案:

修正配置文件语法,删除多余字符,确保 JSON 格式规范(参考步骤 4 中的正确配置)。

问题 3:启动提示Start request repeated too quickly

现象:

Docker 启动后立即失败,系统反复重试后放弃,日志显示该提示。

原因:

核心是 Docker 守护进程(dockerd)启动时解析配置文件失败或权限不足,导致启动流程中断。

排查步骤:

  1. 查看详细日志定位错误:
sudo journalctl -u docker.service --since "10 minutes ago"
  1. 优先检查 daemon.json 格式(最常见原因),其次检查目标目录权限。

问题 4:复制数据时提示“没有那个文件或目录”

现象:

执行 sudo cp -a /var/lib/docker/* /data2/docker/data/ 时提示文件不存在。

原因:

* 仅匹配非隐藏的顶层文件/目录,而 Docker 核心数据存储在子目录(如 containersoverlay2)中,且可能包含隐藏元文件,导致 * 匹配不到内容。

解决方案:

改用 sudo cp -a /var/lib/docker/. /data2/docker/data/ 复制所有内容。

四、迁移后验证与收尾

1. 数据完整性验证

迁移成功后需确认镜像、容器、卷等数据完整:

# 查看镜像(应与迁移前一致)
docker images
# 查看所有容器(运行中/停止状态均需正常显示)
docker ps -a
# 启动任意旧容器,验证运行状态
docker start <容器ID/名称>
# 查看容器日志,确认无异常
docker logs <容器ID/名称>
# 对比源目录与目标目录大小(应基本一致)
sudo du -sh /var/lib/docker
sudo du -sh /data2/docker/data

2. 清理旧数据(可选)

确认迁移后 Docker 运行正常,且目标目录数据完整后,可删除旧目录释放空间:

# 谨慎操作!仅在验证无误后执行
sudo rm -rf /var/lib/docker

3. 长期维护建议

  • 定期监控目标目录磁盘空间,避免再次出现空间不足问题
  • 备份 daemon.json 配置文件:sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak
  • 若需再次迁移,可复用本文流程,核心保持“停止服务→完整复制→修改配置→验证”四步

总结

Docker 数据目录迁移的核心是保证数据完整性配置正确性

  1. 必须使用 cp -arsync -av 复制数据,保留文件属性和隐藏内容
  2. daemon.json 格式严格遵循 JSON 规范,避免多余字符和换行
  3. 迁移前停止 Docker 及 docker.socket,迁移后仔细验证数据完整性

本文记录的迁移过程适用于大多数 Linux 环境,遇到问题时优先通过 journalctl 查看详细日志,90% 的启动失败都是配置语法错误或权限问题导致,针对性修正即可快速解决。

到此这篇关于Docker 数据目录迁移的时间偶像哦啊吗你直接批的文章就介绍到这了,更多相关docker 数据目录迁移内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • docker-compose---安装挂载本地文件启动mariadb问题

    docker-compose---安装挂载本地文件启动mariadb问题

    这篇文章主要介绍了docker-compose---安装挂载本地文件启动mariadb问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Docker容器中查看Python版本的四种方法对比

    Docker容器中查看Python版本的四种方法对比

    在当今云原生和微服务架构盛行的时代,Docker 已成为应用部署和开发的标准工具,确保容器内 Python 环境的正确性至关重要,本文整理了四个Docker容器中查看Python版本的方法,希望对大家有所帮助
    2025-08-08
  • docker容器与centos宿主机时间一致设置方法

    docker容器与centos宿主机时间一致设置方法

    这篇文章主要介绍了docker容器与centos宿主机时间一致设置方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • Docker Desktop镜像源配置全过程

    Docker Desktop镜像源配置全过程

    文章总结:文章主要介绍了如何配置Docker引擎镜像,包括打开配置页面、定位镜像配置位置、替换镜像内容以及测试镜像是否可用,作者分享了个人经验,旨在帮助读者理解并操作Docker镜像配置,同时鼓励大家支持脚本之家
    2026-01-01
  • Docker启动常用容器命令及配置详解

    Docker启动常用容器命令及配置详解

    本文主要介绍了Docker启动常用容器命令及配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • docker创建私有镜像仓库搭建教程

    docker创建私有镜像仓库搭建教程

    本篇文章主要介绍了docker创建私有镜像仓库搭建教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • docker网卡的IP地址修改方法总结

    docker网卡的IP地址修改方法总结

    这篇文章主要给大家总结介绍了关于docker网卡的IP地址修改方法,文中通过实例代码介绍的非常详细,对大家学习或者使用docker具有一定的参考学习价值,需要的朋友可以参考下
    2023-06-06
  • docker部署gitlab实践

    docker部署gitlab实践

    这篇文章主要介绍了docker部署gitlab实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-03-03
  • docker部署Vaultwarden密码共享管理系统的实现(图文)

    docker部署Vaultwarden密码共享管理系统的实现(图文)

    Vaultwarden是一个开源的密码管理器,它提供了类似于Bitwarden的功能,允许用户安全地存储和管理密码、敏感数据和身份信息,本文主要介绍了docker部署Vaultwarden密码共享管理系统的实现,感兴趣的可以了解一下
    2023-10-10
  • 局域网内部署 Docker Registry(推荐)

    局域网内部署 Docker Registry(推荐)

    本文将从创建单机的 Docker Registry 开始,逐步完成局域网内可用的 Docker Registry 的创建,并重点解释如何使用 IP 地址访问 Registry 的方法
    2017-05-05

最新评论