Ubuntu下Docker容器备份与恢复指南
在备份Docker容器前,需明确容器数据存储方式:
docker commit保存为镜像)。docker export或docker commit备份,但重启容器后可能丢失。关键提醒:备份前建议停止容器(docker stop <容器名>),确保数据一致性(尤其是数据库等应用)。
步骤:
docker commit <容器ID或名称> <备份镜像名>:<标签>
示例:docker commit my_nginx my_nginx_backup:latest
docker save -o <备份文件名>.tar <备份镜像名>:<标签>
示例:docker save -o my_nginx_backup.tar my_nginx_backup:latest
适用场景:需要完整备份容器环境(如迁移至其他服务器)。
步骤:
docker run命令挂载数据卷到临时容器,使用tar命令将数据打包到主机目录。docker run --rm -v <数据卷名>:/source -v $(pwd):/backup <基础镜像> tar -czf /backup/<卷备份文件名>.tar.gz -C /source .
示例:docker run --rm -v my_volume:/source -v $(pwd):/backup alpine tar -czf /backup/my_volume_backup.tar.gz -C /source .
说明:
<数据卷名>:通过docker volume ls查看已创建的卷名;--rm:备份完成后自动删除临时容器;-v $(pwd):/backup:将主机当前目录挂载到容器的/backup目录(用于存储备份文件)。步骤:
docker export <容器ID或名称> > <备份文件名>.tar
示例:docker export my_nginx > my_nginx_export.tar
docker import将tar文件转为镜像,再运行容器。cat <备份文件名>.tar | docker import - <新镜像名>:<标签>
示例:cat my_nginx_export.tar | docker import - my_nginx_export:latest
适用场景:快速导出容器当前状态(如临时测试环境)。
# 加载镜像tar文件
docker load -i <备份文件名>.tar
示例:docker load -i my_nginx_backup.tar
# 运行新容器
docker run -d --name <新容器名> -p <主机端口>:<容器端口> <备份镜像名>:<标签>
示例:docker run -d --name my_restored_nginx -p 8080:80 my_nginx_backup:latest
# 使用临时容器挂载目标卷并解压备份文件
docker run --rm -v <目标数据卷名>:/target -v $(pwd):/backup <基础镜像> sh -c "rm -rf /target/* && tar -xzf /backup/<卷备份文件名>.tar.gz -C /target"
示例:docker run --rm -v my_volume:/target -v $(pwd):/backup alpine sh -c "rm -rf /target/* && tar -xzf /backup/my_volume_backup.tar.gz -C /target"
# 导入tar文件为镜像
cat <备份文件名>.tar | docker import - <新镜像名>:<标签>
示例:cat my_nginx_export.tar | docker import - my_nginx_restored:latest
# 运行新容器
docker run -d --name <新容器名> <新镜像名>:<标签>
示例:docker run -d --name my_restored_nginx my_nginx_restored:latest
通过cron定时任务实现定期自动备份,示例脚本backup.sh:
#!/bin/bash
BACKUP_DIR="/data/docker_backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份镜像(示例:备份nginx镜像)
docker save -o $BACKUP_DIR/nginx_$TIMESTAMP.tar nginx:latest
# 备份数据卷(示例:备份my_volume卷)
docker run --rm -v my_volume:/source -v $BACKUP_DIR:/backup alpine \
tar -czf /backup/my_volume_$TIMESTAMP.tar.gz -C /source .
echo "Backup completed at $BACKUP_DIR"
设置定时任务:
# 编辑cron文件
crontab -e
# 添加以下内容(每天凌晨2点执行备份)
0 2 * * * /path/to/backup.sh
restic、duplicati等工具(需自行研究配置)。