Debian Docker如何进行备份恢复
小樊
37
2025-12-13 00:32:23
Debian 上 Docker 的备份与恢复
一 核心原则与准备
- 明确备份对象:持久化数据在 Volumes/Bind Mounts,容器可写层与镜像层是临时的;因此备份要分别处理数据与镜像/配置。
- 保持一致性:对数据库等有状态服务,先执行 FLUSH/LOCK 或短暂 暂停/冻结 容器(如 docker pause),再备份。
- 清单化配置:保存 镜像标签、docker-compose.yml、环境变量、端口与卷映射、Secrets/Configs 等,便于重建。
- 备份介质与保留:将备份复制到 外部存储/对象存储,设置 保留周期 与 定期校验。
- 注意:直接拷贝 Docker 内部目录(如 /var/lib/docker)风险高,仅在了解影响且做好停机与权限处理时采用。
二 常用备份方法
- 镜像与容器快照
- 将容器当前状态提交为镜像:docker commit <容器名或ID> <镜像名:标签>
- 导出镜像为归档:docker save -o <文件.tar> <镜像名:标签>
- 适用:快速“整机”级快照,便于迁移与离线保存。
- 仅文件系统导出
- 导出容器文件系统:docker export -o <文件.tar> <容器名或ID>
- 适用:体积更小,但丢失镜像历史与元数据。
- 数据卷备份(命名卷/绑定挂载)
- 备份命名卷:
docker run --rm -v <卷名>:/source -v <宿主机备份目录>:/backup alpine tar -czf /backup/<卷名>.tar.gz -C /source .
- 备份绑定挂载目录:直接对宿主机目录执行 tar/rsync。
- 适用:数据库、上传文件等持久化数据的核心手段。
- 配置与编排文件
- 备份 docker-compose.yml 或等效的容器运行参数;如使用 Docker Compose,可导出渲染后的配置用于审计与复现。
- 小表速览
- 镜像/容器层:commit + save(保留元数据)/ export(仅文件系统)
- 数据卷:在容器内用 tar 归档到宿主机或对象存储
- 配置:YAML/ENV/Secrets 单独纳入版本与备份体系。
三 恢复步骤
- 从镜像归档恢复
- 导入镜像:docker load -i <文件.tar>
- 启动容器:docker run --name <新名> [原参数] <镜像名:标签>
- 从文件系统归档恢复
- 导入为镜像:cat <文件.tar> | docker import - <镜像名:标签>
- 启动容器:docker run --name <新名> [原参数] <镜像名:标签>
- 数据卷恢复
- 清空目标卷并解压:
docker run --rm -v <卷名>:/target -v <宿主机备份目录>:/backup alpine sh -c “rm -rf /target/* && tar -xzf /backup/<卷名>.tar.gz -C /target”
- 绑定挂载:将备份解压到原宿主机目录后启动容器。
- 配置恢复
- 使用保存的 docker-compose.yml 一键拉起:docker-compose up -d(必要时先 docker-compose pull)。
四 进阶 热迁移与检查点
- 适用场景:在不停止业务的前提下创建运行快照,用于快速回滚或迁移测试。
- 启用实验特性:在 /etc/docker/daemon.json 中设置 {“experimental”: true},重启 Docker。
- 安装检查点工具:在 Debian 上安装 CRIU(可能需额外依赖与库路径配置)。
- 创建检查点:docker checkpoint create [–leave-running=true|false] <容器名> <检查点名>
- 从检查点启动:docker start --checkpoint <检查点名> <容器名>
- 清理检查点:docker checkpoint rm <容器名> <检查点名>
- 重要提示:该功能为 实验性,不建议直接用于生产关键业务。
五 自动化与最佳实践
- 自动化脚本示例(保留最近 30 天)
- 备份:
#!/usr/bin/env bash
BACKUP_DIR=“/backup/docker/$(date +%F_%H-%M-%S)”
mkdir -p “$BACKUP_DIR”
镜像快照
for c in web db; do
docker commit “$c” “${c}_backup:$(date +%F)”
docker save -o “$BACKUP_DIR/${c}_backup.tar” “${c}_backup:$(date +%F)”
done
卷备份
for v in app_data db_data; do
docker run --rm -v “$v”:/src -v “$BACKUP_DIR”:/bak alpine tar -czf “/bak/${v}.tar.gz” -C /src .
done
清理
find /backup/docker -type d -mtime +30 -exec rm -rf {} +
- 校验:对归档生成 校验和 并定期测试恢复流程。
- 建议
- 为数据库容器在备份前执行 FLUSH TABLES WITH READ LOCK 或使用应用层备份工具;
- 将备份推送至 异地/对象存储,并保留 多份与多代;
- 定期做 恢复演练 与 容量评估,避免备份“不可恢复”。