一、迁移前准备
在开始容器批量迁移前,需完成以下准备:
- 环境检查:确认源服务器与目标服务器操作系统、容器运行时(如Docker、containerd)版本兼容。
- 存储规划:确保目标服务器有足够磁盘空间存放镜像和持久化数据,建议预留迁移数据量20%的余量。
- 网络配置:开通源与目标之间的数据传输端口(如22/tcp、2375/tcp),若使用SSH或HTTP传输需确保策略放通。
- 工具安装:在源服务器安装
docker save/load、rsync 或第三方迁移工具(如Skopeo、LazyDocker)。
二、导出容器镜像与数据
2.1 批量导出镜像
使用以下命令生成待迁移容器列表并导出镜像:
- 获取所有运行容器ID:
docker ps -q - 按需筛选(如指定标签或网络):
docker ps --filter "name=app*" -q - 使用循环导出镜像:
for id in $(docker ps -q); do
image=$(docker inspect --format '{{.Config.Image}}' $id)
tar_name=$(echo $image | tr '/' '_' | tr ':' '_')
docker save -o /tmp/migration/${tar_name}.tar $image
done
- 压缩镜像文件:
tar -czf /tmp/images_backup.tar.gz /tmp/migration/
2.2 备份持久化数据
容器通常通过挂载卷或绑定目录存储数据,使用 rsync 或 tar 批量备份:
- 获取挂载点:
docker inspect -f '{{range .Mounts}}{{.Source}}:{{.Destination}} {{end}}' $container_id - 使用
rsync -avz 将数据同步至目标服务器的临时目录。 - 注意:若目标服务器IP变更或端口不同,需提前调整路由。
三、传输至目标服务器
推荐使用SSH+rsync或HTTP/HTTPS下载:
- SSH方式:
rsync -avz -e 'ssh -p 2222' /tmp/migration/ user@target:/data/migration/ - HTTP方式:在源服务器起临时Web服务,目标服务器使用
wget 拉取。 - 校验完整性:传输后对比
md5sum 或 sha256sum。
四、导入镜像与启动容器
4.1 批量导入镜像
在目标服务器执行:
for f in /data/migration/*.tar; do
docker load -i $f
done
若镜像名冲突,可使用 docker tag 重命名。
4.2 重建容器
根据源容器启动参数重建,建议使用 docker inspect 生成 docker run 命令模板:
- 导出启动参数:
docker inspect -f '{{json .Config}}' $container_id > config.json,再结合 jq 解析为可执行命令。 - 或使用自动化工具
docker-compose:在源服务器运行 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v $(pwd):/work:rw ghcr.io/red5d/docker-autocompose 生成compose文件,在目标服务器执行 docker-compose up -d。
五、验证与收尾
- 功能验证:检查容器日志、网络连通性、服务端口响应;对关键业务执行冒烟测试。
- 数据一致性:对比源与目标的数据文件大小、修改时间,或使用
diff -r。 - 清理源数据:确认迁移无误后,在源服务器删除临时备份文件,避免残留。
六、常见问题与注意事项
- 镜像依赖:使用
docker system df 检查未使用的层,迁移后建议运行 docker system prune。 - 网络模式:若容器使用host模式或自定义网络,需在目标服务器先创建相同网络:
docker network create --driver bridge mynet。 - 资源限制:重建容器时需重新设置CPU、内存限制,避免因资源不足导致运行异常。
- 安全加固:传输过程建议启用SSH密钥认证,避免使用明文密码;导入镜像前检查签名或哈希。
通过以上步骤,可实现容器批量、高效、零中断(若配合蓝绿发布)迁移至新服务器。建议在非生产环境先行演练,确保流程无误。