Docker容器如何在Ubuntu上备份
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
)。
二、常用备份方法
1. 使用docker commit
+docker save
(备份容器状态与文件系统)
- 步骤:
(1)停止容器(可选但推荐,避免数据不一致):docker stop < container_name_or_id>
;
(2)将容器当前状态保存为新镜像:docker commit < container_name_or_id> < backup_image_name> :< tag>
(如docker commit my_container my_backup:latest
);
(3)将镜像保存为tar文件(便于传输/存储):docker save -o < backup_file.tar> < backup_image_name> :< tag>
(如docker save -o my_backup.tar my_backup:latest
)。 - 适用场景:快速备份容器状态(如应用配置、文件系统修改),但不包含未挂载卷的数据。
2. 使用docker export
+tar
(备份容器文件系统)
- 步骤:
(1)导出容器文件系统为tar文件:docker export < container_name_or_id> > < backup_file.tar>
(如docker export my_container > my_container_backup.tar
);
(2)(可选)将tar文件压缩以减小体积:gzip my_container_backup.tar
。 - 适用场景:备份容器的完整文件系统(如自定义镜像、非卷数据),但同样不包含卷数据。
3. 备份Docker卷(关键数据保护)
- 步骤:
(1)列出所有卷:docker volume ls
;
(2)使用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
。 - 恢复卷数据:
(1)创建新卷:docker volume create < new_volume_name>
;
(2)解压备份文件到新卷: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
四、恢复流程
1. 恢复镜像
docker load -i <
backup_file.tar>
例如:docker load -i my_backup.tar
。
2. 恢复容器
docker run -d --name <
new_container_name>
<
backup_image_name>
:<
tag>
例如:docker run -d --name my_restored_container my_backup:latest
。
3. 恢复卷数据
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
。
五、注意事项
- 数据一致性:备份前停止容器(尤其是数据库容器),避免数据损坏;
- 备份存储:将备份文件传输到异地(如云存储、NAS),防止本地灾难;
- 测试恢复:定期测试备份文件的恢复流程,确保备份有效性;
- 加密备份:对敏感数据备份文件进行加密(如使用
gpg
),防止泄露。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Docker容器如何在Ubuntu上备份
本文地址: https://pptw.com/jishu/722447.html