15.11.9 备份恢复与灾备演练

备份恢复与灾备演练在容器化环境中应覆盖镜像、配置、数据与运行状态四类资产,明确 RPO/RTO,并通过演练验证。容器是短生命周期,恢复重点是数据卷、配置、镜像仓库与编排配置可恢复性。以下内容给出原理草图、可执行命令、排错与练习。

文章图片

备份范围与策略(含命令示例)#

范围:业务数据卷、Docker元数据与配置、镜像仓库数据、编排配置、主机关键盘快照。
策略:全量+增量+快照,异地副本+校验。

1) 数据卷备份(rsync 增量)

# 1. 识别容器与数据卷
docker ps --format "table {{.Names}}\t{{.Image}}"
docker inspect -f '{{range .Mounts}}{{.Source}} -> {{.Destination}}{{"\n"}}{{end}}' myapp

# 2. 备份到本地目录(示例:/data/volumes/myapp)
mkdir -p /backup/myapp/$(date +%F)
rsync -avh --delete /data/volumes/myapp/ /backup/myapp/$(date +%F)/

# 3. 生成校验清单
cd /backup/myapp/$(date +%F)
find . -type f -print0 | xargs -0 sha256sum > SHA256SUMS

# 预期效果:/backup/myapp/YYYY-MM-DD 存在完整副本与校验文件

2) 数据库容器一致性备份(MySQL 逻辑备份)

# 1. 进入容器或使用 exec
docker exec -it mysql-prod bash -c \
"mysqldump -uroot -p'密码' --single-transaction --routines --events \
--all-databases > /backup/full_$(date +%F).sql"

# 2. 复制到宿主机
docker cp mysql-prod:/backup/full_$(date +%F).sql /backup/mysql/

# 预期效果:/backup/mysql/full_YYYY-MM-DD.sql

3) 镜像仓库数据备份(以 registry 为例)

# 1. 备份 registry 存储目录
rsync -avh /var/lib/registry/ /backup/registry/$(date +%F)/

# 2. 导出镜像清单(用于校验)
curl -s http://registry.local:5000/v2/_catalog > /backup/registry/$(date +%F)/catalog.json

4) Docker 配置与编排文件备份

# 备份 Docker 配置
tar -czf /backup/docker/daemon_$(date +%F).tar.gz /etc/docker/daemon.json /etc/docker/certs.d

# 备份 compose 与环境文件
rsync -avh /opt/compose/ /backup/compose/$(date +%F)/

5) 异地副本(对象存储示例,使用 rclone)

# 安装(Debian/Ubuntu)
apt-get update && apt-get install -y rclone

# 首次配置(按提示填写对象存储参数)
rclone config

# 上传备份
rclone sync /backup/ remote:docker-backup/$(date +%F) --checksum --transfers=4

恢复流程(含命令示例)#

标准流程:确认恢复点 → 隔离故障源 → 准备环境 → 恢复数据 → 恢复配置 → 拉取镜像 → 健康检查 → 切换流量。

示例:恢复卷 + 启动容器

# 1. 停止容器
docker stop myapp

# 2. 恢复数据卷
rsync -avh --delete /backup/myapp/2024-06-01/ /data/volumes/myapp/

# 3. 拉取镜像并启动
docker pull registry.local:5000/myapp:1.2.3
docker run -d --name myapp \
  -v /data/volumes/myapp:/var/lib/myapp \
  --env-file /opt/compose/myapp.env \
  -p 8080:8080 registry.local:5000/myapp:1.2.3

# 4. 健康检查
curl -fsS http://127.0.0.1:8080/health

示例:MySQL 恢复

# 1. 启动干净的 MySQL 容器(或现有容器)
docker run -d --name mysql-restore \
  -e MYSQL_ROOT_PASSWORD=密码 \
  -v /data/volumes/mysql:/var/lib/mysql mysql:8.0

# 2. 导入备份
docker exec -i mysql-restore bash -c "mysql -uroot -p'密码'" < /backup/mysql/full_2024-06-01.sql

# 预期效果:数据库恢复完成,应用可正常连接

灾备演练场景与记录#

建议演练:单容器故障、单主机故障、单可用区故障、镜像仓库不可用。

演练记录模板

演练日期:2024-06-01
场景:镜像仓库不可用
RPO 实测:5分钟
RTO 实测:22分钟
步骤偏差:缺少镜像离线包
改进项:每周导出关键镜像 tar 包

离线镜像包示例(仓库不可用时恢复)

# 导出镜像
docker save registry.local:5000/myapp:1.2.3 -o /backup/images/myapp_1.2.3.tar

# 恢复时导入
docker load -i /backup/images/myapp_1.2.3.tar

排错清单(含命令)#

1) 备份不可读

# 校验清单
cd /backup/myapp/2024-06-01
sha256sum -c SHA256SUMS

2) 快照与应用不一致

# 对数据库使用 --single-transaction
# 或在备份前短暂只读
docker exec mysql-prod mysql -uroot -p'密码' -e "FLUSH TABLES WITH READ LOCK;"
# 备份完成后解除
docker exec mysql-prod mysql -uroot -p'密码' -e "UNLOCK TABLES;"

3) 权限不足

# 确认容器内用户权限
docker exec myapp id
# 修正宿主机目录权限
chown -R 1000:1000 /data/volumes/myapp

练习题(可验证)#

1) 在本机创建一个含数据卷的 Nginx 容器,写入测试文件后完成一次 rsync 备份与恢复,并验证文件内容一致。
2) 导出一个镜像为 tar 包,删除本地镜像后再通过 docker load 恢复并启动。
3) 设计一份 RPO=5分钟、RTO=30分钟的备份计划,写出任务调度与异地同步命令。