备份与迁移
定期备份 Docker 数据是生产环境的重要工作。
镜像备份
导出镜像
sh
# 保存为 tar 文件
docker save -o myimage.tar myimage:tag
# 压缩保存
docker save myimage:tag | gzip > myimage.tar.gz导入镜像
sh
# 从 tar 文件导入
docker load -i myimage.tar
# 从压缩文件导入
gunzip -c myimage.tar.gz | docker load卷备份
备份卷数据
sh
# 备份命名卷
docker run --rm \
-v my-volume:/data \
-v $(pwd):/backup \
alpine tar czf /backup/volume_backup.tar.gz /data恢复卷数据
sh
# 恢复卷数据
docker run --rm \
-v my-volume:/data \
-v $(pwd):/backup \
alpine tar xzf /backup/volume_backup.tar.gz -C /容器备份
导出容器
sh
# 导出容器文件系统
docker export <container> > container.tar
# 从导出文件创建镜像
docker import container.tar myimage:tag完整备份脚本
sh
#!/bin/bash
# backup.sh
BACKUP_DIR="/backup/$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR
# 备份所有镜像
docker images --format "{{.Repository}}:{{.Tag}}" | \
xargs -I {} docker save {} | gzip > $BACKUP_DIR/images.tar.gz
# 备份所有卷
for volume in $(docker volume ls -q); do
docker run --rm \
-v $volume:/data \
-v $BACKUP_DIR:/backup \
alpine tar czf /backup/${volume}.tar.gz /data
done
# 备份 Compose 配置
cp docker-compose.yml $BACKUP_DIR/迁移策略
镜像迁移
sh
# 在源主机导出
docker save myimage:tag | gzip > myimage.tar.gz
# 传输到目标主机
scp myimage.tar.gz user@target:/tmp/
# 在目标主机导入
gunzip -c /tmp/myimage.tar.gz | docker load数据迁移
sh
# 在源主机备份卷
docker run --rm -v my-volume:/data -v $(pwd):/backup \
alpine tar czf /backup/volume.tar.gz /data
# 传输到目标主机
scp volume.tar.gz user@target:/tmp/
# 在目标主机恢复
docker volume create my-volume
docker run --rm -v my-volume:/data -v /tmp:/backup \
alpine tar xzf /backup/volume.tar.gz -C /自动化备份
Cron 定时备份
sh
# 编辑 crontab
crontab -e
# 每天凌晨 2 点备份
0 2 * * * /path/to/backup.sh最佳实践
- 定期备份 - 设置自动化备份任务
- 异地备份 - 备份到不同位置
- 测试恢复 - 定期测试备份恢复
- 版本管理 - 保留多个备份版本
- 监控备份 - 监控备份任务状态
BSFC Tech Pro Tip
生产环境应该建立完整的备份和恢复流程,并定期进行恢复演练。