Docker与Harbor迁移实战:从入门到生产级完整指南
- 前言:为什么要关注迁移?
- 一、迁移的本质:我们要搬什么?
- [二、Docker 迁移:三种场景实战](#二、Docker 迁移:三种场景实战)
-
- [2.1 场景一:只是搬镜像(最常用)](#2.1 场景一:只是搬镜像(最常用))
- [2.2 场景二:搬容器(保留运行状态)](#2.2 场景二:搬容器(保留运行状态))
- [2.3 场景三:整机Docker迁移(高危操作)](#2.3 场景三:整机Docker迁移(高危操作))
- [三、Registry 迁移:私有仓库搬家](#三、Registry 迁移:私有仓库搬家)
-
- [3.1 了解Registry的数据结构](#3.1 了解Registry的数据结构)
- [3.2 方法一:直接拷贝数据目录(最快)](#3.2 方法一:直接拷贝数据目录(最快))
- [3.3 方法二:通过docker pull/push迁移(通用)](#3.3 方法二:通过docker pull/push迁移(通用))
- [四、Harbor 迁移:企业级仓库搬家](#四、Harbor 迁移:企业级仓库搬家)
-
- [4.1 Harbor 的数据组成](#4.1 Harbor 的数据组成)
- [4.2 官方推荐:完整迁移(含权限、配置)](#4.2 官方推荐:完整迁移(含权限、配置))
- [4.3 方法二:只迁移镜像数据(不迁配置)](#4.3 方法二:只迁移镜像数据(不迁配置))
- [4.4 版本升级迁移(常见需求)](#4.4 版本升级迁移(常见需求))
- 五、生产环境迁移最佳实践
-
- [5.1 迁移前的检查清单](#5.1 迁移前的检查清单)
- [5.2 数据校验:如何确认迁移成功?](#5.2 数据校验:如何确认迁移成功?)
- [5.3 回滚预案](#5.3 回滚预案)
- 六、总结:一张表看懂所有迁移方式
- 附录:常用命令速查
前言:为什么要关注迁移?
在容器化运维的日常工作中,迁移是一个绕不开的话题:
- 服务器要退役了,上面的容器怎么办?
- 公司要换机房,几百个镜像怎么搬?
- 测试环境的 Harbor 要升级,数据怎么保留?
本文将带你彻底搞懂 Docker、Registry 和 Harbor 的迁移原理与实战操作,建议收藏备用。
一、迁移的本质:我们要搬什么?
很多新手会混淆概念:Docker ≠ Registry ≠ Harbor。它们的迁移对象完全不同:
| 组件 | 迁移核心数据 | 包含内容 |
|---|---|---|
| Docker | /var/lib/docker |
镜像、容器、卷、网络配置 |
| Registry | /var/lib/registry |
镜像层文件(blobs)、manifest |
| Harbor | /data + 数据库 |
镜像数据 + PostgreSQL + Redis + 配置 |
理解这点至关重要,因为选错迁移方式可能导致:
- ✅ 镜像丢了
- ❌ 权限没了
- ❌ 复制策略失效
二、Docker 迁移:三种场景实战
2.1 场景一:只是搬镜像(最常用)
当你只需要把镜像搬到新机器,容器状态不重要时:
bash
# 旧机器:导出镜像
docker save -o nginx.tar nginx:1.24
docker save -o myapp.tar myapp:latest
# 压缩传输(镜像往往很大)
gzip nginx.tar
scp nginx.tar.gz user@new-server:/tmp/
# 新机器:导入镜像
gunzip nginx.tar.gz
docker load -i nginx.tar
# 验证
docker images | grep nginx
💡 小技巧:批量导出所有镜像
bash
docker save $(docker images -q) -o all-images.tar
# 注意:这样会丢失镜像名和标签,导入后需要重新打标签
2.2 场景二:搬容器(保留运行状态)
想保留容器当前的文件系统和配置(比如已经写入的日志、生成的缓存):
bash
# 旧机器:将容器commit成镜像
docker commit my_container myapp:migrated-v1
# 导出镜像
docker save -o myapp-migrated.tar myapp:migrated-v1
# 新机器:导入并运行
docker load -i myapp-migrated.tar
docker run -d --name myapp-new myapp:migrated-v1
⚠️ 注意:这种方式会丢失容器的网络配置、挂载卷等运行时元数据,只保留文件系统状态。
2.3 场景三:整机Docker迁移(高危操作)
适用条件极其苛刻:
- ✅ 源和目标 Docker 版本完全一致
- ✅ 操作系统一致(比如都是 CentOS 7.9)
- ✅ 存储驱动一致(现在基本都是 overlay2)
- ✅ 网络配置兼容
bash
# 1. 停止源机器Docker
systemctl stop docker
# 2. 同步数据(使用rsync增量同步)
rsync -av --progress /var/lib/docker/ root@new-server:/var/lib/docker/
# 3. 新机器启动Docker
systemctl start docker
# 4. 检查容器状态
docker ps -a # 应该能看到所有容器
🚨 风险提示:如果版本不一致,可能导致 Docker daemon 无法启动!建议只在同版本、同发行版的环境使用。
三、Registry 迁移:私有仓库搬家
3.1 了解Registry的数据结构
先进入 Registry 容器看看:
bash
docker exec -it registry sh
ls /var/lib/registry/docker/registry/v2/
# 会看到:
# blobs/ repositories/
blobs/:存放所有镜像层(每个层一个文件)repositories/:存放仓库和标签的元数据
3.2 方法一:直接拷贝数据目录(最快)
bash
# 旧机器
docker stop registry
tar -czvf registry-backup.tar.gz /var/lib/registry
# 传输到新机器
scp registry-backup.tar.gz new-server:/tmp/
# 新机器
tar -xzvf /tmp/registry-backup.tar.gz -C /
docker run -d \
-p 5000:5000 \
-v /var/lib/registry:/var/lib/registry \
--name registry \
--restart=always \
registry:2
✅ 优点 :极快,几十GB数据几分钟搞定
❌ 缺点:要求新机器路径一致
3.3 方法二:通过docker pull/push迁移(通用)
适用于跨网络、跨版本的迁移:
bash
# 假设旧registry地址:old.registry.com:5000
# 新registry地址:new.registry.com:5000
# 1. 从旧仓库拉取
docker pull old.registry.com:5000/nginx:1.24
# 2. 重新打标签
docker tag old.registry.com:5000/nginx:1.24 new.registry.com:5000/nginx:1.24
# 3. 推送到新仓库
docker push new.registry.com:5000/nginx:1.24
批量迁移脚本:
bash
#!/bin/bash
OLD_REG="old.registry.com:5000"
NEW_REG="new.registry.com:5000"
# 获取所有镜像(需要先手动拉取或通过API获取列表)
for image in $(cat images.txt); do
docker pull $OLD_REG/$image
docker tag $OLD_REG/$image $NEW_REG/$image
docker push $NEW_REG/$image
echo "迁移完成:$image"
done
四、Harbor 迁移:企业级仓库搬家
4.1 Harbor 的数据组成
Harbor 不只是镜像仓库,它包含多个组件:
bash
/data # 默认数据根目录
├── registry/ # 镜像数据 (约 80% 空间)
├── database/ # PostgreSQL 数据 (用户/项目/权限)
├── redis/ # Redis 数据 (session/cache)
├── job_logs/ # 任务日志
├── secret/ # 密钥
└── ca_download/ # 证书
4.2 官方推荐:完整迁移(含权限、配置)
步骤1:停止Harbor服务
bash
cd /opt/harbor # 你的Harbor安装目录
docker-compose down
步骤2:备份数据目录
bash
# 备份整个数据目录
tar -czvf /backup/harbor-data-$(date +%Y%m%d).tar.gz /data
# 备份数据库(额外保障)
docker exec harbor-db pg_dumpall -U postgres > /backup/harbor-db.sql
步骤3:复制到新服务器
bash
scp /backup/harbor-data-*.tar.gz new-server:/backup/
scp /backup/harbor-db.sql new-server:/backup/
scp /opt/harbor/harbor.yml new-server:/opt/harbor/
步骤4:新服务器恢复
bash
# 解压数据
tar -xzvf /backup/harbor-data-*.tar.gz -C /
# 恢复数据库(如果刚才备份了)
cat /backup/harbor-db.sql | docker exec -i harbor-db psql -U postgres
# 重新安装Harbor(使用原配置文件)
cd /opt/harbor
./prepare
docker-compose up -d
4.3 方法二:只迁移镜像数据(不迁配置)
如果你不在乎用户权限、复制策略,只要镜像能拉取:
bash
# 停服务
docker-compose down
# 只同步registry目录
rsync -av --progress /data/registry/ new-server:/data/registry/
# 新机器启动
docker-compose up -d
✅ 适用场景:
- 测试环境迁移
- 从开发Harbor到生产Harbor(只需镜像)
- 快速恢复(先保证能拉取镜像,再慢慢处理权限)
4.4 版本升级迁移(常见需求)
从 Harbor 1.x 迁移到 2.x:
bash
# 1. 备份原数据(必须!)
tar -czvf harbor1-backup.tar.gz /data
# 2. 下载新版本Harbor
wget https://github.com/goharbor/harbor/releases/download/v2.8.0/harbor-offline-installer-v2.8.0.tgz
# 3. 修改配置文件(复制原配置)
cp /opt/harbor-v1/harbor.yml /opt/harbor-v2/
# 4. 运行迁移工具(Harbor自带)
cd /opt/harbor-v2
./migrate -i /opt/harbor-v1/harbor.yml
# 5. 安装新版本
./install.sh
五、生产环境迁移最佳实践
5.1 迁移前的检查清单
- 网络:新老服务器是否互通?
- 存储:新机器磁盘空间是否足够?(至少比原数据大20%)
- 版本:Docker/Registry/Harbor版本是否兼容?
- 证书:HTTPS证书是否需要重新配置?
- 备份:是否做了完整备份?(备份永远不嫌多)
5.2 数据校验:如何确认迁移成功?
Docker 迁移验证:
bash
# 统计镜像数量
docker images | wc -l
# 检查关键镜像是否存在
docker images | grep nginx
Registry/Harbor 验证:
bash
# API验证(需要认证)
curl -u admin:password https://new-harbor.com/api/v2.0/projects
# 拉取测试
docker pull new-harbor.com/library/nginx:1.24
docker run new-harbor.com/library/nginx:1.24 nginx -v
5.3 回滚预案
万一迁移失败怎么办?
bash
# 1. 立即停止新服务
docker-compose down
# 2. 恢复旧服务
cd /old/harbor
docker-compose up -d
# 3. 恢复DNS/负载均衡指向旧地址
# (修改nginx配置或SLB)
# 4. 分析失败原因
tail -f /var/log/harbor/*
六、总结:一张表看懂所有迁移方式
| 迁移对象 | 推荐方式 | 适用场景 | 速度 | 风险 |
|---|---|---|---|---|
| Docker镜像 | save/load |
少量镜像迁移 | 中 | 低 |
| Docker容器 | commit + save |
保留状态 | 慢 | 中 |
| 整机Docker | rsync /var/lib/docker |
完全一致的环境 | 快 | 高 |
| Registry | cp /var/lib/registry |
同服务器迁移 | 快 | 低 |
| Registry | pull/push |
跨网络迁移 | 慢 | 低 |
| Harbor完整 | tar /data + db dump |
生产环境迁移 | 中 | 低 |
| Harbor镜像 | rsync /data/registry |
只迁镜像 | 快 | 中 |
最后提醒 :无论采用哪种方式,数据备份是第一原则。迁移过程中保持旧环境可用,新环境验证通过后再切换流量。
附录:常用命令速查
bash
# Docker 迁移
docker save -o nginx.tar nginx:latest
docker load -i nginx.tar
# Registry 迁移
rsync -av /var/lib/registry/ user@new:/var/lib/registry/
# Harbor 迁移
docker exec harbor-db pg_dumpall -U postgres > backup.sql
tar -czvf harbor-backup.tar.gz /data
# 批量重打标签
docker images | grep old-registry | awk '{print "docker tag "$1":"$2" new-registry:5000/"$1":"$2}' | bash
希望这篇文章能帮你顺利完成迁移任务!如有问题,欢迎在评论区留言交流。