本文出自明月工作室:https://www.freebytes.net/it/java/registry-harbor-copy.html
简介
Harbor跟Registry本质上是差不多的,都是管理Docker镜像的,最为明显的区别Harbor提供了可视化管理镜像的操作界面。
如果需要将Registry替换成为Harbor,那么部署好Harbor之后,需要将Registry的镜像全部迁移到Harbor。
Harbor1.x版本的时候,据说可以直接将 Registry 的镜像文件复制到Harbor的目录下,实现无缝迁移,但我没试过。
我用的是Harbor2.x版本,镜像文件不能直接复制,只能借助脚本实现自动化迁移了。
基本思路
基本的思路就是:
1、找到 Registry 所有的镜像版本
2、将所有 Registry 镜像版本pull到本地
3、将pull到本地的镜像打上tag标签
4、将tag好的镜像push到Harbor
5、将本地残留的镜像删除,节省空间
实现步骤
第一步,安装工具jq
yum install -y jq
第二步,登录 Registry (192.168.50.51:5001)和 Harbor( 192.168.50.50:5000)
docker login 192.168.50.51:5001 docker login 192.168.50.50:5000
第三步,登录Harbor页面,创建一个项目:freebytes
第四步,创建脚本transport.sh,将所有镜像上传到harbor的freebytes项目下
#!/bin/bash
images=`curl -s -u admin:admin123 192.168.50.51:5001/v2/_catalog | jq .repositories[] | tr -d '"'`
for image in $images;
do
tags=`curl -s -u admin:admin123 192.168.50.51:5001/v2/$image/tags/list | jq .tags[] | tr -d '"'`
for tag in $tags
do
echo "--------one step: pull $image:$tag-----------------"
docker pull 192.168.50.51:5001/$image:$tag
echo "--------second step: tag $image-----------------"
docker tag 192.168.50.51:5001/$image:$tag 192.168.50.50:5000/freebytes/$image:$tag
echo "--------third step: push $image:$tag---------------"
docker push 192.168.50.50:5000/freebytes/$image:$tag
echo "--------four step: remove local $image:$tag--------"
docker rmi 192.168.50.51:5001/$image:$tag
docker rmi 192.168.50.50:5000/freebytes/$image:$tag
#break
done
#break
done
第五步,切换为root身份,并执行脚本
sudo sh ./transport.sh
如此,只待传输完成,便大功告成。
单个镜像复制
这里提供另一个脚本,可以手动输入镜像名称,使得Registry的对应镜像自动复制到Harbor的对应项目下。
#!/bin/bash
for((i=0;i<20;))
do
read -t 30 -p "请输入镜像名称:" image
read -t 30 -p "请输入目标项目名称:" target
echo -e "\n"
echo "镜像为:$image, 传输到harbor的target项目下"
tags=`curl -s -u admin:admin123 192.168.50.51:5001/v2/$image/tags/list | jq .tags[] | tr -d '"'`
for tag in $tags
do
echo "--------one step: pull $image:$tag-----------------"
docker pull 192.168.50.51:5001/$image:$tag
echo "--------second step: tag $image-----------------"
docker tag 192.168.50.51:5001/$image:$tag 192.168.50.50:5000/$target/$image:$tag
echo "--------third step: push $image:$tag---------------"
docker push 192.168.50.50:5000/$target/$image:$tag
echo "--------four step: remove local $image:$tag--------"
docker rmi 192.168.50.51:5001/$image:$tag
docker rmi 192.168.50.50:5000/$target/$image:$tag
#break
done
#break
done