温馨提示×

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 或使用应用层备份工具;
    • 将备份推送至 异地/对象存储,并保留 多份与多代
    • 定期做 恢复演练容量评估,避免备份“不可恢复”。

0