如何备份和迁移 Docker Compose 管理的卷数据到另一台服务器

文章导读
迁移 Docker Compose 管理的卷数据,最稳妥的方式是停止服务后单独打包数据卷或绑定挂载目录,而不是试图迁移整个容器。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

迁移 Docker Compose 管理的卷数据,最稳妥的方式是停止服务后单独打包数据卷或绑定挂载目录,而不是试图迁移整个容器。

先说结论:Compose 项目迁移的核心在于数据卷(Volumes)和绑定挂载(Bind Mounts)的独立备份,镜像和容器配置可以通过 compose 文件重建。

  • 适合场景:服务器更换、磁盘扩容、环境重建,尤其是包含数据库或有状态服务的项目。
  • 先准备:确认卷类型(命名卷还是主机目录),准备足够的临时存储空间用于打包。
  • 验收标准:新服务启动后,原有数据(如数据库记录、上传文件)可正常读取且无报错。

命令速用版

针对命名卷(Named Volumes),使用临时容器打包是最通用的方法:

如何备份和迁移 Docker Compose 管理的卷数据到另一台服务器
# 导出卷数据到当前目录
docker run `--rm` -v 卷名称:/data -v $(pwd):/backup alpine tar czf /backup/数据卷名.tar.gz -C /data .

# 在新服务器导入数据
docker volume create 卷名称
docker run `--rm` -v 卷名称:/data -v $(pwd):/backup alpine sh -c "cd /data && tar xzf /backup/数据卷名.tar.gz"

如果是绑定挂载(主机目录),直接使用 rsyncscp 复制目录即可。

为什么会这样

Docker 容器本身是无状态的,docker exportdocker commit 只能保存容器文件系统内的变更,无法包含挂载在外的数据卷。数据卷的设计初衷就是独立于容器生命周期,存储在宿主机的特定目录(通常是 /var/lib/docker/volumes)或指定路径下。因此,迁移时必须单独处理这些数据文件,否则新容器启动后将是空数据状态。

分步处理

1. 停止服务
为保证数据一致性,迁移前务必停止相关容器。

如何备份和迁移 Docker Compose 管理的卷数据到另一台服务器
docker compose down

2. 确认数据位置
查看 docker-compose.yml 中的 volumes 定义。如果是命名卷,使用上述打包命令;如果是绑定挂载(如 ./data:/app/data),直接打包主机上的 ./data 目录。

3. 传输数据
使用 scprsync 将生成的压缩包或目录同步到新服务器。

如何备份和迁移 Docker Compose 管理的卷数据到另一台服务器
scp 数据卷名.tar.gz user@new_server:/path/to/backup

4. 恢复数据
在新服务器上,先创建同名卷(如果是命名卷),再解压数据。确保目录权限与原服务器一致,避免容器启动后因权限不足无法写入。

怎么验证是否生效

启动服务后,不要只看容器状态是否为 Up,要进入业务层面验证:

  • 数据库类:查询几条关键业务数据,确认记录存在。
  • 文件服务:访问之前上传的文件,确认能正常下载。
  • 日志检查:查看容器日志 docker compose logs,确认没有权限拒绝(Permission denied)或数据损坏报错。

常见坑

  • 权限问题:不同服务器的用户 ID(UID)可能不同,直接复制数据卷可能导致新容器中进程无法写入数据,必要时需 chown 修正。
  • 服务未停:如果在 Docker 服务运行时直接复制 /var/lib/docker/volumes 目录,可能导致数据损坏,建议停止服务或使用容器打包法。
  • 路径不一致:绑定挂载依赖主机绝对路径,新服务器目录结构若不同,需修改 docker-compose.yml 或创建软链接。

参考来源

  • 真正的生产力来了!Docker 迁移部署两步搞定!
  • Docker 容器迁移方法汇总含镜像与数据卷迁移 - 开发者社区 - 阿里云
  • 在 Docker 容器之间拷贝数据:原理与操作示例
  • Linux 系统盘空间不足,想要将 Docker 镜像和容器数据迁移到数据盘