Docker与Harbor迁移实战:从入门到生产级完整指南

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 迁移:企业级仓库搬家)
  • 五、生产环境迁移最佳实践
    • [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

希望这篇文章能帮你顺利完成迁移任务!如有问题,欢迎在评论区留言交流。

相关推荐
babe小鑫1 小时前
大数据运维与管理专业学习数据分析的必要性
大数据·运维·学习
郁大锤1 小时前
macOS 终端 SSH 到 Linux 后快捷键失效解决方法
linux·macos·ssh
开开心心_Every2 小时前
剪切板工具存500条,可搜索备份导入导出
linux·运维·服务器·华为od·edge·pdf·华为云
zsyf19872 小时前
Linux部署Redis集群
linux·运维·redis
2301_816073832 小时前
RHCA扩展
linux·运维·服务器·虚拟机启动
zlpzpl2 小时前
Linux系统下安装配置Nginx(保姆级教程)
java·linux·nginx
黄俊懿2 小时前
【架构师从入门到进阶】第一章:架构设计基础——第二节:架构设计原则
分布式·后端·中间件·架构
筵陌2 小时前
Linux网络传输层协议UDP
linux·网络
技术传感器2 小时前
赋能智慧空间:看本体论如何破解城市更新运营难题
人工智能·深度学习·架构