温馨提示×

ubuntu docker数据怎么备份

小樊
34
2025-12-10 13:20:58
栏目: 智能运维

Ubuntu 上 Docker 数据备份与恢复实用指南

一 备份策略与准备

  • 识别数据位置:持久化数据通常位于 Docker 数据卷(Volume)绑定挂载(Bind Mount)容器可写层。优先备份卷数据,避免直接操作 Docker 内部目录。
  • 选择方法:
    • 卷数据:用“临时容器 + tar”打包最安全通用。
    • 绑定挂载目录:可直接用 rsynctar
    • 无法停容器时:对数据库等先执行应用层导出(如 mysqldump),再备份卷。
  • 环境检查与空间评估:确认 Docker 服务运行、备份盘 剩余空间充足,必要时先演练恢复流程。

二 方法一 备份 Docker 数据卷(推荐)

  • 单卷备份(命名卷或匿名卷均可)
    • 命名卷示例(备份到当前目录):
      docker run --rm \
        -v mysql_data:/source \
        -v $(pwd):/backup \
        alpine sh -c "tar -zcvf /backup/mysql_data_$(date +%F).tar.gz -C /source ."
      
    • 匿名卷示例(用卷 ID):
      VOL_ID="7ef48a99e9642..."
      docker run --rm \
        -v ${VOL_ID}:/source \
        -v $(pwd):/backup \
        alpine sh -c "tar -zcvf /backup/vol_${VOL_ID}_$(date +%F).tar.gz -C /source ."
      
    • 需要查看进度可安装 pv 并替换打包命令为:
      tar -zcvf - -C /source . | pv -s $(du -sb /source | awk '{print $1}') > /backup/file.tar.gz
      
  • 从“数据卷容器”备份(如果你在用数据卷容器模式)
    # 备份
    docker run --rm --volumes-from dbdata -v $(pwd):/backup busybox \
      tar czvf /backup/dbdata_$(date +%F).tar.gz /dbdata
    
    # 恢复(先建新卷容器)
    docker run -d -v /dbdata --name dbdata2 ubuntu /bin/bash
    docker run --rm --volumes-from dbdata2 -v $(pwd):/backup busybox \
      tar xzvf /backup/dbdata_$(date +%F).tar.gz -C /
    
  • 批量/全量卷备份思路
    • 列出卷:docker volume ls --format "{{.Name}}"
    • 用 Shell 循环对命名卷执行“单卷备份”命令;匿名卷可用卷 ID 备份。
    • 建议加入保留策略(如保留最近 30 天)与备份后校验(如 tar tzvf 列清单)。

三 方法二 备份绑定挂载与容器文件系统

  • 绑定挂载目录(宿主机路径已知)
    # 备份
    rsync -aP /host/data/ /backup/data_$(date +%F)/
    
    # 恢复
    rsync -aP /backup/data_YYYY-MM-DD/ /host/data/
    
  • 容器文件系统(不依赖卷,适合一次性导出)
    # 备份
    docker cp <container_id>:/var/www /backup/container_www_$(date +%F)
    
    # 恢复
    docker cp /backup/container_www_YYYY-MM-DD <container_id>:/var/www
    
  • 说明:docker cp 便捷但不包含容器元数据(如启动命令、环境变量);如需完整可重建性,结合镜像/容器导出或记录编排文件。

四 方法三 备份镜像与容器元数据(可选)

  • 镜像备份与恢复
    # 备份
    docker save -o myimage_latest.tar myimage:latest
    
    # 恢复
    docker load -i myimage_latest.tar
    
  • 容器导出与导入(仅文件系统快照,不含元数据)
    # 导出
    docker export -o mycontainer.tar mycontainer
    
    # 导入为镜像
    docker import mycontainer.tar mynewimage:latest
    
  • 适用场景:迁移/重装 Docker 前保存镜像资产;容器层备份仅作补充,持久化数据仍以卷/绑定挂载为主。

五 恢复与校验及注意事项

  • 卷数据恢复
    # 恢复到已有卷(同名卷)
    docker run --rm \
      -v mysql_data:/target \
      -v $(pwd):/backup \
      alpine sh -c "tar xzvf /backup/mysql_data_YYYY-MM-DD.tar.gz -C /target"
    
    # 若路径不同,解压到目标路径
    tar xzvf /backup/file.tar.gz -C /desired/path
    
  • 完整性校验
    • 列出归档内容:tar tzvf /backup/file.tar.gz
    • 必要时做恢复演练,确认应用能正常启动与读写。
  • 注意事项
    • 不建议直接复制 /var/lib/docker/volumes/ 内部文件,易产生一致性问题;应通过“临时容器 + tar”方式操作。
    • 生产环境尽量在 低峰期 执行,或先对数据库执行应用层备份(如 mysqldump)。
    • 权限与安全:备份文件含敏感数据时注意 权限与加密,并做好 异地/离线 留存与定期清理策略。

0