Docker 应用&数据备份、迁移方案

一、为什么要做Docker数据备份

1、保障数据与配置的安全性

  • 防止数据丢失:Docker 容器本身是 "临时性" 的(基于镜像创建,删除后数据默认丢失),但容器中运行的应用(如数据库、日志服务)会产生持久化数据。若容器意外崩溃、误删除或主机故障,未备份的数据可能永久丢失。 例如:MySQL 容器突然宕机,且未对挂载的/var/lib/mysql数据卷备份,将导致数据库数据全部丢失。

  • 保留配置状态:容器的启动参数(如环境变量、端口映射)、网络配置、镜像版本等信息,是应用正常运行的基础。备份这些配置可避免因误操作或环境变更导致的配置错乱。

2、支持环境迁移与扩展

  • 跨主机 / 跨平台迁移:当需要将应用从开发环境迁移到生产环境、从物理机迁移到云服务器,或从 Linux 迁移到 Windows(Docker 支持跨平台)时,通过备份的镜像、容器配置和数据卷,可以快速在新环境中复现相同的运行状态,避免重复部署的繁琐和配置不一致问题。 例如:将本地测试好的 Python 应用容器备份后,迁移到云服务器的 Docker 环境,无需重新安装依赖和调试参数。

  • 集群与多实例扩展:在分布式架构中,通过备份的镜像和数据,可以快速复制出多个相同的容器实例,实现负载均衡或高可用部署。备份确保了所有实例的初始状态一致。

3、容灾要求

  • 快速恢复业务:当主机遭遇硬件故障、病毒攻击、自然灾害等灾难时,基于备份的镜像和数据,可以在备用主机上迅速重建 Docker 环境和应用,减少业务中断时间(RTO,恢复时间目标)。 例如:服务器硬盘损坏后,通过备份的 Docker 镜像和数据卷,可在新服务器上 10 分钟内恢复应用运行,而重新部署可能需要数小时。

  • 版本回滚能力:若应用升级后出现 bug 或兼容性问题,可通过备份的历史镜像和数据,回滚到之前的稳定版本,降低故障影响。

二、 Docker迁移方案

(1)同一服务器迁移

如果你只是想把 Docker 目录从默认的 /var/lib/docker 挪到更大的硬盘,步骤如下:

  1. 先停掉 Docker 服务:systemctl stop docker
  1. 复制整个目录到新位置:rsync -av /var/lib/docker/new/path
  1. 修改配置文件 /etc/docker/daemon.json,添加 "graph": "/new/path/docker"
  1. 重启服务:systemctl start docker

关键提醒:迁移后一定要用 docker info 检查根目录是否已更新,避免白忙活。

(2)跨服务器迁移

当需要把容器搬到另一台服务器时,推荐 "镜像 + 数据卷" 组合方案:

  • 先把容器 Commit 成镜像:docker commit 容器名 镜像名:版本
  • 保存镜像为 tar 包:docker save -o 文件名.tar 镜像名
  • 用 scp 传到目标服务器:scp 文件名.tar 用户名 @IP:/ 目录
  • 在新服务器加载镜像:docker load -i 文件名.tar

如果涉及数据卷,记得用 docker volume ls 找到卷名,然后打包卷目录(默认在 /var/lib/docker/volumes/ 卷名 /_data)。

(3)迁移过程可能的坑

  • 迁移后容器启动失败?检查新服务器的内核版本和 Docker 版本是否兼容
  • 网络不通?跨主机迁移要重新配置 overlay 网络或用 portainer 可视化管理
  • 权限报错?别忘了用 chown -R 重新授权数据目录

二、备份方案

(1)手动备份

适合个人开发者的 3 条核心命令:

  • 备份镜像:docker save 镜像名 | gzip > 备份文件名.tar.gz
  • 备份容器:docker export 容器 ID > 容器快照.tar
  • 备份数据卷:tar -zcvf 卷备份.tar.gz/var/lib/docker/volumes/ 卷名

备注:

把这些命令写成 shell 脚本,用 crontab 设置定时任务,比如每天凌晨 3 点自动备份。

(2)工具推荐

  • Docker Volume Backup:专门备份数据卷的轻量工具,支持定时备份到本地或 S3
  • restic:开源备份工具,支持增量备份和加密,适合多服务器管理
  • Portainer:图形化面板里的 "备份 / 恢复" 功能,鼠标点几下就搞定,新手首选

以 Portainer 为例,在 "Stacks" 页面点击备份按钮,就能把整个应用栈(包括配置和数据)打包,恢复时上传文件即可,比手动操作快 10 倍。

(3)备份策略

记住 "321 原则":

  • 至少保留 3 份备份
  • 存放在 2 种不同介质
  • 1 份备份要离线存储(比如冷备份硬盘)

三、实战案例:电商平台迁移全过程

某服装电商用 Docker 部署了 MySQL、Redis 和 Node.js 应用,需要从阿里云迁移到腾讯云:

  1. 先在目标服务器搭建相同版本的 Docker 环境
  1. 用 rsync 同步数据卷(主要是 MySQL 数据)
  1. 用 docker-compose 打包整个应用配置
  1. 先迁移 Redis 缓存,再停服迁移 MySQL(业务中断仅 15 分钟)
  1. 最后用 Nginx 做 30 分钟的流量切换缓冲

四、注意事项

  1. 每次迁移前一定要做全量备份
  1. 定期恢复测试,见过太多人备份了半年,真出事才发现文件损坏
  1. 生产环境建议用 Docker Swarm 或 K8s 的自动迁移功能
相关推荐
一叶知秋yyds9 分钟前
Ubuntu 虚拟机安装 OpenClaw 完整流程
linux·运维·ubuntu·openclaw
斯普信云原生组1 小时前
Prometheus 环境监控虚机 Redis 方案(生产实操版)
运维·docker·容器
喵了几个咪1 小时前
如何在 Superset Docker 容器中安装 MySQL 驱动
mysql·docker·容器·superset
工具罗某人1 小时前
docker compose部署kafka集群搭建
docker·容器·kafka
safestar20122 小时前
ES批量写入性能调优:BulkProcessor 参数详解与实战案例
java·大数据·运维·jenkins
来一颗砂糖橘2 小时前
负载均衡的多维深度解析
运维·负载均衡
楠奕2 小时前
CentOS7安装GoldenDB单机搭建及常见报错解决方案
linux·运维·服务器
GCTTTTTT3 小时前
远程服务器走本地代理
运维·服务器
剑锋所指,所向披靡!3 小时前
Linux常用指令(2)
linux·运维·服务器
飞Link3 小时前
逆向兼容的桥梁:3to2 自动化降级工具实现全解析
运维·开发语言·python·自动化