Docker容器在Ubuntu上的备份方法及实践
在备份Docker容器前,需明确数据持久化是关键——容器内的数据默认随容器删除而丢失,因此需优先将数据存储在**Docker卷(Volumes)**中(而非容器文件系统)。可通过docker volume ls查看现有卷,docker volume create <volume_name>创建新卷,并在运行容器时通过-v <volume_name>:/data挂载卷(如docker run -d -v my_volume:/data --name my_container my_image)。
docker commit+docker save(备份容器状态与文件系统)docker stop <container_name_or_id>;docker commit <container_name_or_id> <backup_image_name>:<tag>(如docker commit my_container my_backup:latest);docker save -o <backup_file.tar> <backup_image_name>:<tag>(如docker save -o my_backup.tar my_backup:latest)。docker export+tar(备份容器文件系统)docker export <container_name_or_id> > <backup_file.tar>(如docker export my_container > my_container_backup.tar);gzip my_container_backup.tar。docker volume ls;docker run命令将卷数据打包到主机目录:docker run --rm -v <volume_name>:/volume -v $(pwd):/backup busybox tar cvf /backup/<volume_name>_backup.tar /volume
例如,备份名为my_volume的卷:docker run --rm -v my_volume:/volume -v $(pwd):/backup busybox tar cvf /backup/my_volume_backup.tar /volume。docker volume create <new_volume_name>;docker run --rm -v <new_volume_name>:/volume -v $(pwd):/backup busybox tar xvf /backup/<volume_name>_backup.tar -C /volume
可通过Shell脚本实现定期自动备份,以下脚本备份所有容器镜像、容器文件系统及卷数据:
#!/bin/bash
# 设置备份目录
BACKUP_DIR="/backup/docker"
mkdir -p $BACKUP_DIR
# 备份所有容器镜像
echo "Backing up Docker images..."
docker images -q | while read image_id; do
docker save $image_id > "$BACKUP_DIR/image_${image_id}.tar"
done
# 备份所有容器文件系统
echo "Backing up Docker containers..."
docker ps -a -q | while read container_id; do
docker export $container_id > "$BACKUP_DIR/container_${container_id}.tar"
done
# 备份所有卷数据
echo "Backing up Docker volumes..."
for volume in $(docker volume ls | awk '{print $1}'); do
echo "Backing up volume $volume..."
docker run --rm -v $volume:/volume -v $(pwd):/backup busybox tar cvf "/backup/volume_${volume}_backup.tar" -C /volume .
done
echo "Backup completed. Files stored in $BACKUP_DIR."
使用方法:将脚本保存为backup_docker.sh,赋予执行权限(chmod +x backup_docker.sh),再通过cron设置定时任务(如每日凌晨2点执行):
crontab -e
添加以下行:
0 2 * * * /path/to/backup_docker.sh
docker load -i <backup_file.tar>
例如:docker load -i my_backup.tar。
docker run -d --name <new_container_name> <backup_image_name>:<tag>
例如:docker run -d --name my_restored_container my_backup:latest。
docker run --rm -v <new_volume_name>:/volume -v $(pwd):/backup busybox tar xvf "/backup/volume_<volume_name>_backup.tar" -C /volume
例如:docker run --rm -v my_new_volume:/volume -v $(pwd):/backup busybox tar xvf "/backup/my_volume_backup.tar" -C /volume。
gpg),防止泄露。