适用于 CentOS 的 Docker 备份与恢复方案
一 备份策略与准备
- 明确备份范围:优先保护业务数据(Docker 卷)、镜像与容器可重建部分、以及 /etc/docker 配置。
- 选择一致性方式:
- 有状态服务(数据库、消息队列等)优先在容器内执行热备或使用卷快照,再备份卷数据。
- 无状态服务可直接备份镜像与卷。
- 准备与校验:
- 备份目录与时间戳:如 /backup/docker-2025-12-23-1200。
- 保留多份与异地/离线副本(如对象存储、NFS、外接盘)。
- 记录关键元数据:镜像清单、容器启动命令(可用 docker inspect)、卷名与挂载路径、网络与端口映射、环境变量与 secrets 来源。
- 版本与兼容性:跨主机迁移时尽量保持 Docker 版本相近;不同版本间镜像层通常可兼容,但元数据与特性可能差异。
二 方法一 镜像与容器的打包迁移(适合快速迁移与重建)
- 备份镜像
- 单镜像:docker save -o /backup/myapp_latest.tar myapp:latest
- 批量镜像:docker save -o /backup/all_images.tar $(docker images -q)
- 压缩传输:docker save myapp:latest | gzip > myapp_latest.tar.gz
- 恢复镜像
- 普通加载:docker load -i /backup/myapp_latest.tar
- 压缩包:gunzip -c myapp_latest.tar.gz | docker load
- 从运行中容器创建新镜像(保留当前文件系统变更)
- docker commit <容器名或ID> myapp_backup:20251223
- 再按上节 docker save/load 迁移
- 导出/导入容器文件系统快照(不包含元数据与历史层)
- 导出:docker export <容器名或ID> > container_fs.tar
- 导入:cat container_fs.tar | docker import - myapp_imported:20251223
- 说明
- save/load 保留镜像历史与元数据,适合迁移与重建;export/import 仅文件系统快照,常用于“取文件”。
三 方法二 数据卷与配置的全量备份(适合灾备与系统重装)
- 备份卷数据(推荐在宿主机对卷目录做快照,或用临时容器打包)
- 查看卷:docker volume ls
- 临时容器打包(不依赖卷插件):
- 备份:docker run --rm --volumes-from myapp -v /backup:/backup centos:7 tar czvf /backup/vol_myapp-20251223.tar.gz /var/lib/mysql
- 恢复:docker run --rm --volumes-from myapp -v /backup:/backup centos:7 tar xzvf /backup/vol_myapp-20251223.tar.gz -C /
- 备份 Docker 根目录与配置(停机一致性更佳)
- 停机:systemctl stop docker
- 打包:tar czvf /backup/docker-root-20251223.tar.gz -C /var/lib/docker .
- 打包配置:tar czvf /backup/docker-config-20251223.tar.gz -C /etc/docker .
- 启动:systemctl start docker
- 恢复
- 配置:tar xzvf /backup/docker-config-20251223.tar.gz -C /
- 数据根目录:先停 Docker,tar xzvf /backup/docker-root-20251223.tar.gz -C /,再启动 Docker
- 卷数据:按“临时容器打包”的逆过程解压到目标卷挂载点
- 说明
- 卷是持久化首选;/var/lib/docker 包含镜像层、容器层与卷元数据,整库备份适合“整机/重装”场景。
四 迁移与恢复流程示例
- 源机备份
- 镜像:docker save -o /backup/app_20251223.tar myapp:latest
- 卷:docker run --rm --volumes-from myapp -v /backup:/backup centos:7 tar czvf /backup/vol_myapp-20251223.tar.gz /var/lib/mysql
- 配置:tar czvf /backup/docker-config-20251223.tar.gz -C /etc/docker .
- 传输到目标机
- scp /backup/ user@target:/backup/
- 目标机恢复
- 安装并启动 Docker:yum install -y docker && systemctl start docker && systemctl enable docker
- 配置:tar xzvf /backup/docker-config-20251223.tar.gz -C /
- 镜像:docker load -i /backup/app_20251223.tar
- 卷:docker volume create myapp_data;docker run --rm --volumes-from myapp -v /backup:/backup centos:7 tar xzvf /backup/vol_myapp-20251223.tar.gz -C /
- 启动应用:docker run -d --name myapp -v myapp_data:/var/lib/mysql myapp:latest
- 说明
- 上述流程同样适用于跨机房/云厂商迁移;如采用卷插件(如 NFS、块存储),优先使用其原生快照/备份能力。
五 注意事项与最佳实践
- 一致性优先:数据库等请在容器内执行 热备/冻结(如 mysqldump、pg_dump、xtrabackup),再备份卷;避免仅依赖文件系统拷贝导致数据不一致。
- 避免直接拷 /var/lib/docker:运行时拷贝易损坏;若必须整库迁移,务必先停机并校验备份完整性(如 sha256sum)。
- 使用命名卷与明确挂载路径:便于定位与恢复;避免把关键数据放在容器可写层。
- 保留启动元数据:docker inspect 输出与 compose/stack 文件一起归档,重建时减少手工误差。
- 定期演练恢复:至少每季度验证一次备份可用性与恢复时长(RTO/RPO 自评)。
- 存储与保留策略:按容量与合规设置保留周期(如 7/30/90 天),并做异地副本与离线归档。