备份与灾难恢复
容器化应用需要完整备份和恢复策略,下面介绍实施方案。
备份对象
需要备份的内容
- 数据卷 (Volumes):数据库、缓存、应用数据
- 配置文件:Compose 文件、环境变量
- 镜像:自定义镜像保存到仓库
- 密钥:TLS 证书、密码
数据卷备份
完整备份
Bash
# 备份数据卷
docker run --rm \
-v my-data:/data:ro \
-v $(pwd):/backup \
alpine \
tar czf /backup/my-data-$(date +%Y%m%d).tar.gz -C /data .
增量备份
Bash
# 使用 rsync 增量
docker run --rm \
-v my-data:/data:ro \
-v $(pwd):/backup \
alpine/rsync \
-av --delete /data/ /backup/latest/
配置文件备份
Bash
# 备份 Compose 文件
cp docker-compose.yml backup/docker-compose-$(date +%Y%m%d).yml
# 备份环境变量
cp .env.backup backup/.env-$(date +%Y%m%d)
# 版本控制
git add backup/
git commit -m "Backup $(date +%Y%m%d)"
镜像备份
Bash
# 保存镜像到文件
docker save my-app:latest > my-app-$(date +%Y%m%d).tar
# 推送到备用仓库
docker tag my-app:latest backup-registry.com/my-app:latest
docker push backup-registry.com/my-app:latest
恢复流程
数据恢复
Bash
# 创建新卷
docker volume create my-data-restored
# 从备份恢复
docker run --rm \
-v my-data-restored:/data \
-v $(pwd):/backup \
alpine \
tar xzf /backup/my-data-20240101.tar.gz -C /data
# 启动应用
docker compose up -d
完整恢复
Bash
# 1. 恢复配置文件
cp backup/docker-compose.yml .
cp backup/.env .
# 2. 恢复数据卷
docker volume create db-data
docker run --rm -v db-data:/data -v $(pwd):/backup alpine \
tar xzf /backup/db-data.tar.gz -C /data
# 3. 启动应用
docker compose up -d
# 4. 验证恢复
docker compose ps
curl http://localhost:8080/health
RTO/RPO
定义
- RTO (Recovery Time Objective):恢复时间目标(系统中断到恢复的最大时间)
- RPO (Recovery Point Objective):恢复点目标(可接受的最大数据丢失时间)
策略
| 级别 | RTO | RPO | 备份频率 | 成本 |
|---|---|---|---|---|
| 关键 | <1h | <5min | 持续 | 高 |
| 重要 | <4h | <1h | 每小时 | 中 |
| 一般 | <24h | <24h | 每天 | 低 |
灾难演练
Bash
#!/bin/bash
# disaster-recovery-test.sh
echo "=== 灾难恢复演练 ==="
# 1. 停止所有容器
docker compose down -v
# 2. 删除所有数据
docker volume prune -f
# 3. 从备份恢复
echo "从备份恢复..."
./restore.sh
# 4. 启动应用
docker compose up -d
# 5. 验证服务
sleep 30
curl -f http://localhost:8080/health
if [ $? -eq 0 ]; then
echo "✅ 恢复成功"
else
echo "❌ 恢复失败"
exit 1
fi
要点总结
- 备份对象:数据卷、配置文件、镜像、密钥
- 数据卷使用 tar 打包备份,支持完整和增量备份
- 恢复流程:恢复配置 → 恢复数据 → 启动 → 验证
- RTO 定义恢复时间目标,RPO 定义可接受数据丢失
- 定期灾难演练验证备份有效性,确保 RTO/RPO 达标
📝 发现内容有误?点击此处直接编辑