如何将完整且安全的 Docker 容器迁移到另一台服务器?
Docker容器的完整备份和迁移涉及三个主要步骤: 图像, 数据(卷或绑定挂载) 和 配置/元数据. 本分步指南介绍了迁移容器化服务(包括 Web 应用程序和数据库)的安全、无错误且可逆的方法。.
一般原则和先决条件
开始之前,请确保您已准备好以下物品:
- SSH 访问 使用相应的用户或 root 用户对两台服务器都执行此操作。.
- 在源系统和目标系统上安装 Docker(如果需要,还需要安装 docker-compose)。快速安装示例:
curl -fsSL https://get.docker.com | sh
# or follow your distribution guide- 检查磁盘空间是否足够存放归档文件。.
- 用于安全传输的 SSH 密钥和工具 rsync 或者 SCP-1811.
- 制定服务中断计划或低延迟方法。.
首先要检查的命令:
docker ps -a
docker volume ls
df -h
du -sh /var/lib/docker/volumes/*备份和迁移策略——选择合适的方法
实现全面转型的三大关键要素:
- 图像 容器(代码/二进制文件)
- 稳定数据 (卷或绑定挂载)
- 配置和元数据 (docker-compose.yml 文件、环境变量文件、网络配置、密钥)
常用方法:
- docker export / docker import:包含容器文件系统,但不传输元数据和命名卷。.
- docker 保存 / docker 加载适用于创建的图像。.
- 备份卷 打包成 tar 文件,然后使用 rsync/scp 传输或上传到 S3。.
- 使用私有注册表 用于推送/拉取图像。.
- 使用管理工具 就像使用 docker-compose 或 Kubernetes 一样,通过定义来重建服务。.
场景 1 — 本地镜像和命名卷(例如,Web 应用程序 + MySQL)
假设:Web 容器和名为 mysql_data 的卷的 MySQL 数据库。步骤如下:
1)获取容器镜像
如果您有本地镜像或容器已进行更改,请先找到镜像名称和容器 ID,然后根据需要提交并保存容器。.
docker ps --no-trunc --format '{{.Image}} {{.ID}}'
docker commit CONTAINER_ID myapp:backup-2026-07-14
docker save -o /tmp/myapp_backup_image.tar myapp:backup-2026-07-142) 命名卷备份
使用辅助容器将主机上的卷内容打包成 tar 文件的安全方法:
docker run --rm \
-v mysql_data:/data \
-v /tmp/backup:/backup \
ubuntu \
bash -lc "cd /data && tar czf /backup/mysql_data.tar.gz ."对于大数据,您可以使用速度更快的压缩器,例如 zstd:
docker run --rm -v mysql_data:/data -v /tmp/backup:/backup ubuntu bash -lc "cd /data && tar -I 'zstd -19' -cf /backup/mysql_data.tar.zst ."3)数据库备份(首选)
为确保数据库的一致性和完整性,最好进行逻辑转储:
docker exec CONTAINER_ID sh -c 'exec mysqldump --all-databases --single-transaction -u root -p"$MYSQL_ROOT_PASSWORD"' > /tmp/all_databases.sql解释: 该方法消除了对卷文件系统的依赖,并生成了一个健康的逻辑转储。.
4)传输到目标服务器
对于安全、连续的传输,建议使用 rsync,尤其适用于大文件传输。.
rsync -avP -e "ssh -p 22" /tmp/myapp_backup_image.tar user@target:/tmp/
rsync -avP -e "ssh -p 22" /tmp/mysql_data.tar.gz user@target:/tmp/或者用SCP更简单些:
scp /tmp/myapp_backup_image.tar user@target:/tmp/笔记: 对于大批量传输,请使用 rsync --partial --progress 或 rclone 等工具到 S3/MinIO。.
5) 恢复到目标服务器
上传镜像并恢复卷,然后使用 docker-compose 启动服务:
docker load -i /tmp/myapp_backup_image.tar
docker volume create --name mysql_data
docker run --rm -v mysql_data:/data -v /tmp/backup:/backup ubuntu bash -lc "cd /data && tar xzf /backup/mysql_data.tar.gz"如果您使用了 SQL 转储,请创建一个临时 MySQL 容器并执行导入操作:
docker run --name mysql-temp -e MYSQL_ROOT_PASSWORD=yourpassword -d mysql:8
cat /tmp/all_databases.sql | docker exec -i mysql-temp sh -c 'mysql -u root -p"$MYSQL_ROOT_PASSWORD"'然后放置 docker-compose.yml 和 env 文件并启动服务:
docker-compose -f docker-compose.yml up -d6)测试和复习
别忘了检查日志、数据完整性和校验和:
docker logs -f CONTAINER
sha256sum /tmp/mysql_data.tar.gz
sha256sum /tmp/backup/mysql_data.tar.gz场景 2 — 带有绑定挂载(主机文件夹)的容器
如果容器使用绑定挂载(例如主机上的 /srv/app/data),只需使用 rsync 或 tar 同步主机路径,在目标位置准备相同的路径,然后启动容器即可。.
rsync -avP -e "ssh" /srv/app/data/ user@target:/srv/app/data/然后使用相同的绑定挂载路径在目标位置启动容器。.
场景 3 — 敏感数据库零停机迁移
为了减少服务中断:
- 复制 实施(MySQL 复制或 PostgreSQL 流式传输),并在同步后执行切换。.
- 初始和最终 rsync:首先使用 rsync 同步大量数据,然后使用 –inplace 和 –delete 进行最终的 rsync 同步较小的更改。.
rsync -azP --delete --inplace /var/lib/docker/volumes/mysql_data/_data/ user@target:/var/lib/docker/volumes/mysql_data/_data/完成最后一次 rsync 操作后,停止该服务几秒钟,然后在目标位置重新启动它。.
转学方案比较(优势/劣势)
- Docker 保存/加载:图像处理速度快,但不包括体积数据。.
- Docker 导出/导入:包含容器文件系统,但丢失元数据和卷。.
- 卷上的 rsync:可精确控制和恢复,但需要管理和测试。.
- 逻辑数据库转储:可靠且适用于不同数据库版本之间的迁移。.
- 私人登记处:将图像分发到多个服务器的最佳实践;持久数据应单独传输。.
安全提示(非常重要)
一些实用的安全提示:
- 使用受保护的私钥和访问限制的 SSH。.
- 使用诸如以下工具在传输前保护敏感数据: 通用石油公司 或者 年龄 加密。示例:
gpg --encrypt --recipient [email protected] /tmp/mysql_data.tar.gz传输完成后,务必使用以下命令验证文件的完整性: SHA256 评分 查看。.
在目的地,启动服务之前,请检查防火墙和端口限制,如有必要,请设置严格的访问限制。.
大数据实用技巧和优化
- 压缩 使用 zstd 或 gzip 并设置合适的压缩级别:tar -I 'zstd -19' -cf backup.tar.zst /data
- 如果连接不稳定,请使用带有 --partial 参数的 rsync 命令恢复连接。.
- 对于数TB的数据传输,请考虑寄送物理磁盘或使用靠近目的地的对象存储。.
Docker 兼容性和版本
迁移前请检查源 Docker 版本和目标 Docker 版本。通常情况下,镜像都是兼容的,但 Compose 或驱动程序中的一些新功能可能需要进行适配。.
选择迁移位置和服务器类型
数据中心位置和服务器类型的选择取决于应用场景:
- 交易和外汇: 位置靠近交易所服务器,延迟最低。.
- 游戏: 欧洲/美国或靠近具备 DDoS 防护能力的玩家的便利位置。.
- 人工智能与渲染: 用于高 I/O 的 GPU 和 NVMe 服务器。.
- 网站: 云服务器配备 CDN,且服务器位置靠近主要用户。.
我们公司在全球拥有超过 85 个办公地点、GPU 服务器和 BGP 网络,可以满足各种迁移需求。.
完整示例:使用 docker-compose 进行 Web + MySQL 迁移
步骤概要:
- docker-compose 配置和本地镜像创建的输出:
docker-compose -f docker-compose.yml config > /tmp/compose_config.yml
docker-compose build
docker save $(docker-compose images -q web) -o /tmp/web_image.tar- 备份卷:
docker run --rm -v project_mysql:/data -v /tmp/backup:/backup ubuntu bash -lc "cd /data && tar czf /backup/mysql_data.tar.gz ."- 使用 rsync 将文件传输到目标位置,然后在目标位置恢复并运行 docker-compose。.
切换前的最终检查清单
- 镜像和卷已备份,校验和已验证。.
- 环境变量和密钥都受到保护或存放。.
- 已检查 Docker 和 Compose 版本。.
- 目标网络和防火墙已配置完成。.
- 已定义回滚方案。.
- 最终日程已经公布,监测工作也已准备就绪。.









