Debian系统上Docker备份全流程指南
在Debian环境中,Docker备份需覆盖镜像、容器数据、数据卷、配置及网络五大核心元素,确保故障或迁移时能快速恢复。以下是具体操作步骤及注意事项:
-v /宿主机目录:/容器目录),避免直接存储在容器可写层(删除容器会导致数据丢失)。/backup)有足够磁盘空间(镜像/卷数据可能较大)。镜像是容器的基础,需保存为.tar文件以便后续加载。
# 获取所有镜像ID
docker images -q | while read image_id; do
# 为每个镜像生成带时间戳的备份文件
docker save -o "/backup/docker_images_$(date +%Y%m%d_%H%M%S)_${image_id}.tar" "$image_id"
done
说明:docker save会保存镜像的所有层及元数据,恢复时用docker load -i 镜像文件.tar即可。
若容器内有需保留的临时数据(如应用日志、未持久化的文件),可通过以下两种方式备份:
# 停止容器(可选,确保数据一致性)
docker stop <容器名或ID>
# 提交容器为新镜像
docker commit <容器名或ID> "backup_$(date +%Y%m%d)_<容器名>"
# 保存镜像为tar文件(同步骤1)
docker save -o "/backup/committed_container_$(date +%Y%m%d).tar" "backup_$(date +%Y%m%d)_<容器名>"
docker export -o "/backup/container_fs_$(date +%Y%m%d).tar" <容器名或ID>
说明:docker commit仅保存文件系统变更,不保留卷、网络等元数据;docker export导出的是容器当前的文件系统快照。
数据卷是Docker推荐的持久化存储方式,需通过tar归档备份其内容:
# 列出所有数据卷
docker volume ls | awk '{print $2}' | while read volume_name; do
# 创建临时容器挂载卷,并归档数据到宿主机
docker run --rm -v "$volume_name":/source -v "/backup":/backup alpine \
tar -czf "/backup/${volume_name}_$(date +%Y%m%d).tar.gz" -C /source .
done
说明:此方法通过临时Alpine容器挂载卷,将数据压缩归档到宿主机/backup目录。恢复时用tar -xzf 卷备份文件.tar.gz -C /目标目录即可。
Docker守护进程及网络配置需单独备份,避免恢复时重新配置:
# 备份Docker守护进程配置(默认路径)
sudo cp /etc/docker/daemon.json "/backup/daemon_$(date +%Y%m%d).json"
# 备份Docker网络配置(包含网络定义)
sudo tar -czvf "/backup/docker_networks_$(date +%Y%m%d).tar.gz" /etc/docker/network
说明:daemon.json包含Docker的启动参数(如日志驱动、存储驱动),/etc/docker/network包含自定义网络配置(如桥接网络、MACVLAN)。
Docker网络本身无需直接备份,但需保留网络配置(已在步骤4中完成)。若需备份网络拓扑信息,可通过docker network inspect导出:
# 导出所有网络配置为JSON文件
docker network ls | awk '/^([0-9a-f]{12})$/ {print $1}' | xargs -I {} docker network inspect {} > "/backup/docker_networks_inspect_$(date +%Y%m%d).json"
说明:此文件可用于恢复网络配置(如自定义网络的子网、网关)。
通过cron定时任务实现每日自动备份,避免人工遗漏:
/usr/local/bin/docker_backup.sh):#!/bin/bash
BACKUP_DIR="/backup"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# 创建备份目录
mkdir -p "$BACKUP_DIR"
# 备份镜像
docker images -q | while read image_id; do
docker save -o "$BACKUP_DIR/docker_images_${TIMESTAMP}_${image_id}.tar" "$image_id"
done
# 备份数据卷
docker volume ls | awk '{print $2}' | while read volume_name; do
docker run --rm -v "$volume_name":/source -v "$BACKUP_DIR":/backup alpine \
tar -czf "$BACKUP_DIR/${volume_name}_${TIMESTAMP}.tar.gz" -C /source .
done
# 清理30天前的备份
find "$BACKUP_DIR" -type f -name "*.tar*" -mtime +30 -delete
chmod +x /usr/local/bin/docker_backup.sh
echo "0 3 * * * /usr/local/bin/docker_backup.sh >> /var/log/docker_backup.log 2>&1" | sudo tee -a /etc/crontab
gpg加密tar文件)。通过以上步骤,可实现Debian环境下Docker数据的全面备份,保障业务连续性。