返回

Docker 数据目录迁移完整指南:从 /var/lib/docker 迁移到自定义路径

原创
admin的头像admin·发布于 2026-01-29 13:55·阅读 74

前言

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

一、迁移前准备

1. 环境确认

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

2. 核心工具与命令

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

3. 关键前提

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

二、详细迁移步骤

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

Docker 会持续读写数据目录,因此在迁移前需要完全停止服务,并停止 docker.socket 防止其自动激活。

bash 复制代码
# 停止 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,与默认目录的权限一致。

bash 复制代码
# 创建目标目录(-p 确保父目录递归创建)
sudo mkdir -p /data/docker

# 配置所有者为 root:root
sudo chown -R root:root /data/docker

# 配置权限(保证 root 读写权限,其他用户可执行)
sudo chmod -R 701 /data/docker

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

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

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

命令说明

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

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

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

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

正确配置内容(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": "/data/docker"  // 核心:指定新数据目录
}

配置注意事项

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

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

启动 Docker 服务并验证新数据目录是否生效。

bash 复制代码
# 启动 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 复制进程已启动,不受后续空输入干扰。
  • 后续回车仅向终端输入空行,终端会忽略无意义输入。

验证方法

bash 复制代码
# 查看 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 语法错误,可能是多余的逗号或非法换行符。

解决方案:修正配置文件语法,删除多余字符,确保 JSON 格式规范。

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

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

原因:Docker 守护进程启动时解析配置文件失败或权限不足,导致启动流程中断。

排查步骤

bash 复制代码
# 查看详细日志定位错误
sudo journalctl -u docker.service --since "10 minutes ago"

解决方案:优先检查 daemon.json 格式,确保没有错误;其次检查目标目录权限。

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

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

原因* 仅匹配非隐藏的顶层文件/目录,Docker 核心数据存储在子目录中,且可能包含隐藏元文件。

解决方案:改用 sudo cp -a /var/lib/docker/. /data2/docker/data/,确保复制所有内容。

四、迁移后验证与收尾

1. 数据完整性验证

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

bash 复制代码
# 查看镜像(应与迁移前一致)
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 运行正常,且目标目录数据完整后,可删除旧目录释放空间。

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

3. 长期维护建议

  • 定期监控目标目录磁盘空间,避免再次出现空间不足问题。
  • 备份 daemon.json 配置文件:sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak
  • 若需再次迁移,可复用本文流程,
作者的其他文章
IP地址配置HTTPS 内网IP配置HTTPS保姆教程
本文介绍了在Nginx中配置HTTPS的完整流程:1)使用OpenSSL生成自签名证书和私钥;2)解密私钥以避免重启时输入密码;3)配置Nginx支持HTTPS,包括指定证书路径、设置安全协议和加密套件等。适用于开发、测试和内网环境,但需注意自签名证书会触发浏览器警告,生产环境建议使用CA签发的正式证书。通过简单的命令和配置即可实现基本的HTTPS加密保护。
IP地址配置HTTPS 内网IP配置HTTPS保姆教程
2025年必备:让Nginx配置清晰如诗的工具推荐
文章浏览阅读464次,点赞4次,收藏4次。本文介绍了格式化Nginx配置文件的重要性,指出良好格式能提升可读性、团队协作效率和降低错误风险。文章推荐了2025年优秀的在线格式化工具,这类工具应具备操作简单、专业格式化效果、安全保障等特性。建议将格式化工具集成到开发流程中,并制定团队规范,以优雅管理Nginx配置。文末推荐了一个专业在线格式化工具,帮助开发者高效处理配置文件。
2025年必备:让Nginx配置清晰如诗的工具推荐
Claude 命令大全:从入门到精通的终端操作指南(2025 最新)
本教程全面整理 *Claude 命令行(CLI)使用指南*,从基础启动命令、项目管理、权限控制、模型切换到高级思考模式,全方位提升开发者在终端中使用 Claude 的效率。适合新手与资深开发者收藏参考。
Claude 命令大全:从入门到精通的终端操作指南(2025 最新)
屏幕检测专家 — 专业的在线屏幕测试工具
屏幕检测专家 — 专业的在线屏幕测试工具
屏幕检测专家 — 专业的在线屏幕测试工具
Keye-VL-1.5-8B(快手 Keye-VL)— 腾讯云两卡 32GB GPU **保姆级** 部署指南(Ubuntu 22.04 / CUDA 12.2 / Driver 535.216.01 / Python 3.10)
保姆级教程:在腾讯云两卡 32GB GPU(Ubuntu 22.04 / CUDA 12.2)上完整部署快手 Keye-VL-1.5-8B。包含驱动安装、conda 环境、PyTorch、bitsandbytes、vLLM、ModelScope 模型下载与 Gradio demo 运行步骤及常见排错。适合工程复现与上线优化。
Keye-VL-1.5-8B(快手 Keye-VL)— 腾讯云两卡 32GB GPU **保姆级** 部署指南(Ubuntu 22.04 / CUDA 12.2 / Driver 535.216.01 / Python 3.10)
Ubuntu系统ECS重启后“/etc/resolv.conf”被还原怎么办?
处理方法 在处理前,建议先禁用systemd-resolved服务。 方法一:手动修改/etc/resolv.conf文件。 以root用户登录ECS。 关闭并禁用systemd-resolved服务
共享打印机报错连不上怎么办?修复错误代码(0x000006d9/0x0000011b 等)最新Win10/11 共享打印机常见问题 + 解决教程,附工具!
Win11 打印机共享报错全面修复指南:涵盖 0x000006d9、0x0000011b、0x0000007e 等常见码,并提供一键 PowerShell 工具,十分钟内搞定老款惠普共享打印机。
共享打印机报错连不上怎么办?修复错误代码(0x000006d9/0x0000011b 等)最新Win10/11 共享打印机常见问题 + 解决教程,附工具!
实战Spring Boot + Vue 集成 Activiti 工作流引擎 | 双模式简单 & 自定义审批平台
基于 Spring Boot 与 Vue 的高效工作流平台,支持简单模式与自定义模式双引擎,在线流程建模、版本管理、审批节点灵活配置,多渠道消息通知,Docker/K8s 部署,高可用与可扩展。
2025 年国内 Docker/DockerHub 镜像源加速列表(7 月 28 日更新 · 长期维护)
2025 年最新国内 Docker Hub 镜像源加速列表,包含轩辕镜像、腾讯云、阿里云、DaoCloud、AtomHub 等多家稳定 CDN 服务,附详细配置教程与常见问题说明,适用于 Linux、macOS、Windows 平台。
2025 年国内 Docker/DockerHub 镜像源加速列表(7 月 28 日更新 · 长期维护)
Linux环境下修改人大金仓数据库用户密码的完整指南
本篇博客将手把手教你如何在Linux环境中,通过命令行连接人大金仓数据库并修改指定用户的密码。适用于初学者及数据库维护人员,提供完整命令和使用说明。