它解决的核心运维问题
当 Docker 数据目录不断膨胀,最终把系统盘压到接近告警线时,docker-data-move.sh 就很有价值。它特别适合那种“业务已经在跑、磁盘也快满了、但又不想手工乱搬目录”的场景。
和在压力下手改 daemon.json、手工 rsync、自己停服务相比,这个脚本把迁移拆成了更清晰的步骤:先检测、再选盘、再停服务、再同步数据、最后更新配置并校验结果。
最适合落地的环境
它最适合那种“最初默认装在系统盘里,后来业务长起来才发现该搬家”的长期运行主机。像这次 CentOS 7 主机,Docker Root Dir 在 `/home/docker-data`,而 `/home` 只剩几百 MiB,这就是很典型的使用场景。
- 单机服务场景里,Docker 数据已经明显超出原始磁盘容量
- 需要把迁移流程文档化,便于团队交接和复盘
- 想避免“临时 rsync + 手改配置”这种高风险操作
- 像 Harbor、Registry、私有平台这类长期累积镜像和 volume 的节点
如何理解 CentOS 7 上这段输出
从这次 CentOS 7 的输出可以直接读出几件事:当前 Docker Root Dir 在 `/home/docker-data`,`/home` 盘几乎满了,而脚本自动选择了空间更大的 `/data/docker-data` 作为迁移目标。
当日志进入 `Syncing Docker data to /data/docker-data ...` 时,说明前面的检测、选盘和停服务都已经完成,当前正在用 `rsync` 复制镜像层、容器层、volume 以及相关元数据。
- 当前 Docker 已用空间:53.85 GiB
- 建议目标盘至少可用:61.93 GiB
- 自动选中的目标目录:`/data/docker-data`
- `docker.socket` 的 warning 更像提示,不代表迁移失败
预计还要多久
像 `98%` 到 `99%`、`8MB/s` 到 `9MB/s` 这样的进度,通常说明已经进入收尾阶段了。对这台大约 `53.85 GiB` 的主机来说,正常情况下往往只剩几分钟,但如果尾部还有很多小文件、目录项或 metadata 要刷盘,也可能比百分比看起来更久。
比较稳妥的教程写法可以是:当输出已经到 `98%` 到 `99%` 时,通常代表大头数据已经完成,剩余时间大致在几分钟到十几分钟之间,具体取决于磁盘性能、文件碎片和 volume 文件数量。
迁移完成后的日志说明
当 rsync 进入收尾阶段后,脚本并不会立刻结束。它会先把旧的 Docker 数据目录备份为带时间戳的目录,再重新启动 Docker,确认新的 data-root 已经生效,最后把旧数据目录和 daemon.json 的备份位置打印出来。
这段输出里最关键的一行是 `Verification passed. Docker Root Dir is now /data/docker-data`。这表示迁移已经不只是文件复制完成,而是 Docker 已经成功从新目录启动,新的数据目录也已经正式接管。
- `99%` 且 `to-chk=0`,表示复制阶段实际上已经完成
- `Backing up current Docker data dir` 表示旧目录已经被保留下来,便于回滚
- `Starting Docker service` 表示真正的切换阶段已经开始
- `Verification passed` 是最值得放进教程和运维交接文档里的成功标志
适合写进教程的操作步骤
如果你要把它整理成给运维同学看的教程,建议按“迁移前检查、执行命令、观察日志、迁移后验证”这四段来写,最容易理解,也方便现场照着执行。
- 先执行 `df -PT` 和 `docker info | grep "Docker Root Dir"`,确认当前磁盘和数据目录位置
- 执行 `curl -fsSL helper.sh/docker-data-move.sh | sudo bash -s -- --auto --yes`
- 在 `Syncing Docker data ...` 阶段耐心等待,不要手工重启 Docker
- 脚本完成后再次执行 `docker info | grep "Docker Root Dir"`,确认已经切到新目录
- 确认业务容器和镜像仓库恢复正常,再考虑清理旧备份目录