Skip to content

备份与迁移

定期备份 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

最佳实践

  1. 定期备份 - 设置自动化备份任务
  2. 异地备份 - 备份到不同位置
  3. 测试恢复 - 定期测试备份恢复
  4. 版本管理 - 保留多个备份版本
  5. 监控备份 - 监控备份任务状态

BSFC Tech Pro Tip

生产环境应该建立完整的备份和恢复流程,并定期进行恢复演练。


由 BSFC Tech 提供技术支持