温馨提示×

Docker在Debian中的备份与恢复怎么做

小樊
46
2025-11-25 06:11:53
栏目: 智能运维

Docker在Debian中的备份与恢复

一、备份范围与准备

  • 明确需要保护的对象:持久化数据(Docker 卷)、镜像、容器可写层(若有重要运行时文件)、以及编排与配置(如 docker-compose.yml/etc/docker/daemon.json)。
  • 选择备份时机:为保证一致性,数据库等有状态服务建议先停止或置于维护模式;对允许短暂中断的场景,可先停止相关容器再备份。
  • 准备存储与保留策略:选择本地磁盘、NFS、对象存储或异地备份,并设定保留周期与校验机制(如校验和/定期恢复演练)。

二、按对象备份与恢复

  • 镜像
    • 备份:将镜像导出为 tar 归档
      • 命令:docker save -o my-image.tar my-image:tag
    • 恢复:从归档加载镜像
      • 命令:docker load -i my-image.tar
  • 容器可写层或目录
    • 备份:将容器内目录复制到主机
      • 命令:docker cp <容器名或ID>:/var/www/html /host/backup/html
    • 恢复:将主机备份复制回容器
      • 命令:docker cp /host/backup/html <容器名或ID>:/var/www/html
  • Docker 卷
    • 备份:先定位卷的挂载点,再复制到主机
      • 步骤:
        • docker volume ls
        • docker volume inspect <卷名> | grep Mountpoint(得到宿主机路径)
        • sudo cp -a <Mountpoint> /host/backup/vol_<卷名>
    • 恢复:将备份数据复制回卷挂载点或在运行容器时挂载备份目录为数据卷
      • 方式A(重建卷数据):sudo cp -a /host/backup/vol_<卷名> <Mountpoint>
      • 方式B(运行容器时挂载):docker run -v /host/backup/vol_<卷名>:/var/lib/mysql ...
  • 编排与配置
    • 备份:保存应用编排文件与 Docker 配置
      • 命令:
        • cp docker-compose.yml /host/backup/
        • sudo cp /etc/docker/daemon.json /host/backup/(如有)
  • 整机的 Docker 数据目录(重装或迁移 Docker 引擎时使用)
    • 备份:归档 /var/lib/docker
      • 命令:sudo tar -czvf docker_backup.tar.gz -C /var/lib/docker .
    • 恢复:在新环境安装 Docker 后解压到相同路径
      • 命令:sudo tar -xzvf docker_backup.tar.gz -C /var/lib/docker
    • 说明:此方式会连同镜像、容器、卷和网络等一起迁移,需确保版本兼容与停机窗口。

三、自动化与注意事项

  • 自动化备份脚本示例
    • 作用:批量备份镜像、卷、容器可写层与关键配置,便于定时执行与异地拷贝。
    • 示例:
      #!/usr/bin/env bash
      set -e
      BACKUP_DIR="/host/backup/$(date +%F_%H-%M-%S)"
      mkdir -p "$BACKUP_DIR"
      
      # 1) 镜像
      docker images --format '{{.Repository}}:{{.Tag}}' | while IFS= read -r img; do
        [[ -z "$img" ]] && continue
        docker save -o "$BACKUP_DIR/$(echo "$img" | tr '/:' '_').tar" "$img"
      done
      
      # 2) 卷
      docker volume ls -q | while IFS= read -r vol; do
        mp=$(docker volume inspect -f '{{.Mountpoint}}' "$vol")
        [[ -z "$mp" ]] && continue
        sudo cp -a "$mp" "$BACKUP_DIR/vol_$vol"
      done
      
      # 3) 容器可写层(按需选择路径)
      docker ps -q | while IFS= read -r cid; do
        name=$(docker inspect -f '{{.Name}}' "$cid" | sed 's,^/,,')
        docker cp "$cid:/var/www/html" "$BACKUP_DIR/${name}_html" 2>/dev/null || true
      done
      
      # 4) 配置
      sudo cp /etc/docker/daemon.json "$BACKUP_DIR/" 2>/dev/null || true
      cp docker-compose.yml "$BACKUP_DIR/" 2>/dev/null || true
      
      echo "Backup finished: $BACKUP_DIR"
      
    • 建议:配合 cron 定时执行,并将备份目录同步到远程存储或对象存储。
  • 注意事项
    • 一致性:数据库等请先停写或使用应用层备份工具;对一致性要求高的卷,优先在宿主机层面执行快照或使用卷插件能力。
    • 版本与兼容性:跨大版本恢复 Docker 数据目录可能不兼容;镜像/卷跨平台迁移需确保架构一致(如 amd64/arm64)。
    • 安全性:备份文件含敏感数据,建议加密并限制访问权限;传输到远端时使用 scp/rsync over SSH 或对象存储的加密功能。
    • 校验与演练:定期做恢复演练与校验(如对比文件数量/校验和),验证备份可用性。

四、进阶 热迁移与近零停机

  • 适用场景:需要在运行中迁移容器或做快速回滚时,可考虑基于 CRIU 的 Checkpoint/Restore 能力实现“热迁移/热备份”。
  • 要点:
    • 在主机安装并验证 CRIU 支持(criu check),确保内核与 Docker 版本满足要求。
    • 通过 Docker 的实验性 C/R 功能对容器做检查点保存,再在目标主机恢复,实现近零停机迁移或快速回滚。
    • 该方式对应用与内核特性有一定要求,生产使用前务必充分测试。

0