CentOS 下 Docker 迁移指南
一 迁移场景与准备
- 适用场景:将 Docker 默认数据目录 /var/lib/docker 迁移到更大的磁盘(如 /data、新挂载盘 /mnt/sdb 等),以解决根分区空间不足或性能问题。
- 准备要点:
- 确认新目录所在磁盘空间充足、性能满足需求。
- 迁移前先备份关键镜像与数据卷(如用 docker save 导出镜像,或备份挂载到宿主机的卷目录)。
- 规划停机窗口,尽量一次性完成迁移与验证,减少对业务影响。
二 标准迁移步骤 data-root 方式(推荐)
- 步骤概览:
- 查看当前 Docker 根目录与磁盘使用
- 查看根目录:docker info | grep -i “Docker Root Dir”
- 查看占用:docker system df
- 停止 Docker 服务
- 迁移数据(保持权限与属性)
- 建议用 rsync 增量复制:rsync -aP /var/lib/docker/ /new-path/docker/(末尾斜杠“/”表示复制目录内容)
- 配置新数据目录
- 编辑或创建 /etc/docker/daemon.json,设置 “data-root”:
{
“data-root”: “/new-path/docker”
}
- 启动并验证
- systemctl daemon-reload && systemctl start docker
- 验证:docker info | grep -i “Docker Root Dir”,应显示新路径;运行 docker images、docker ps -a 检查对象是否完整
- 观察与回滚
- 观察日志与业务运行状态,确认无误后再清理旧数据:rm -rf /var/lib/docker.bak(若此前已备份并重命名)
- 说明:
- 使用 data-root 是现代 Docker 推荐做法;旧参数 –graph/-g 已废弃,不建议再使用。
三 备选方案
- 软链接方式(不改配置)
- 思路:将新目录软链到 /var/lib/docker,对应用无感知。
- 简要步骤:
- 停服务:systemctl stop docker
- 迁移数据:mv /var/lib/docker /var/lib/docker.bak && rsync -aP /var/lib/docker.bak/ /new-path/docker/
- 建软链:ln -sfn /new-path/docker /var/lib/docker
- 启服务:systemctl start docker 并验证
- 注意:部分容器编排系统(如 Kubernetes)对软链支持不佳,生产环境更推荐 data-root 方式。
- 修改 systemd service 启动参数(不推荐)
- 思路:在 /usr/lib/systemd/system/docker.service 的 ExecStart 中增加 –graph /new-path/docker 并重启。
- 风险:与 daemon.json 配置可能冲突,维护成本高,且 –graph 已废弃,不建议使用。
四 迁移后验证与清理
- 验证清单:
- 根目录变更:docker info | grep -i “Docker Root Dir” 显示新路径
- 对象完整性:docker images、docker ps -a 数量与预期一致
- 运行验证:启动关键容器,检查日志与挂载卷数据是否可达
- 资源与性能:观察磁盘使用与 I/O 是否正常
- 清理与回滚:
- 确认无误后删除旧数据:rm -rf /var/lib/docker.bak
- 若出现异常,可快速回滚:停服务、移除软链或恢复 daemon.json、将备份拷回 /var/lib/docker、再启动服务。
五 常见问题与排错
- 权限与特殊权限丢失
- 迁移时务必保留权限与扩展属性,建议使用 rsync -aP 或 cp -pR;丢失 /tmp 的粘滞位等可能导致容器(如 MongoDB)启动失败。
- 配置冲突与旧参数
- 同时设置 daemon.json 的 data-root 与 service 的 –graph 会导致冲突;且 –graph/-g 已废弃,请统一使用 data-root。
- 软链在编排环境不兼容
- Kubernetes 等场景不建议使用软链,优先选择 data-root 方式。
- 空间不足导致复制失败
- 迁移前用 docker system df 与 df -h 评估空间,必要时先清理无用数据(如 docker system prune),或扩容新盘后再迁移。