一、需求
只需要备份Harbor上的镜像,Harbor中存在很多不同的公有和私有项目,每个项目下又有很多镜像,每个镜像有不同版本的标签,考虑服务器成本,不能再搭一台Harbor来备份了,主备模式的备份方案无法使用;
较完整的Harbor备份可查看专栏《Harbor实战宝典》
二、方案设计
1、编写一个shell脚本(在备份主机上):
1)获取Harbor中所有的镜像;
2)通过docker下载获取到的镜像列表;
3)将下载到本地的镜像打成tar包,以便恢复;
4)删除下载到本地的镜像,减少磁盘空间的占用;
2、在备份主机安装docker,配置文件中指定Harbor的地址;
3、执行备份的shell脚本进行备份;
4、定期备份的设定,观察镜像上传频率,只需要每周备份一次即可;
该方案仅占用备份主机的磁盘空间,通过Harbor的管理界面看到需要备份镜像总大小为2T,
该方案的难点再于如何获取镜像的列表,查看官方文档,可以通过调用API接口的方式来获取镜像列表。
三、实战操作
3.1、备份主机上安装docker
本处以192.168.2.250:443为Harbor服务地址。
192.168.2.266为备份主机,用于备份镜像操作,本文所有操作皆在备份主机完成。
注意:需要在/etc/docker/damon.json文件中指定Harbor地址。
# yum install -y docker
# systemctl enable --now docker.service
# cat > /etc/docker/damon.json << EOF
{
"registry-mirrors": ["https://xcg41ct3.mirror.aliyuncs.com"],
"insecure-registries":["192.168.2.250:443"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# systemctl restart docker && systemctl status docker
3.2、编写shell脚本
Go、python可参考该处
# vim Harback-v2.sh
#!/bin/bash
Harbor_Address=192.168.2.250:443 #Harbor主机地址
Harbor_User=admin #登录Harbor的用户
Harbor_Passwd=Harbor12345 #登录Harbor的用户密码
Images_File=harbor-images-`date '+%Y-%m-%d'`.txt #镜像清单文件
Tar_File=/backup/Harbor-backup/ #镜像tar包存放路径
###【】调用API接口获取Harbor中所有仓库的所有镜像及镜像的所有标签(tag):
#获取Harbor中所有的项目(含私有项目)
Project_List=`curl -u $Harbor_User:$Harbor_Passwd -X GET http://$Harbor_Address/api/projects | grep name | awk '/"name": /' | awk -F '"' '{print $4}'`
#获取项目下所有的镜像名称与标签:
for Project in $Project_List;do
Image_Names=`curl -u $Harbor_User:$Harbor_Passwd -X GET http://$Harbor_Address/api/search?q=$Project | grep "repository_name" | awk -F "\"" '{print $4}'`
for Image in $Image_Names;do
Image_Tags=`curl -u $Harbor_User:Harbor_Passwd -X GET http://$Harbor_Address/api/repositories/$Image/tags | awk '/"name": /' | awk -F '"' '{print $4}'`
for Tag in $Image_Tags;do
echo "$Harbor_Address/$Image:$Tag" | grep -v Base | grep -v Image >> $Images_File
done
done
done
###使用docker从镜像文件中下载镜像——将下载的镜像进行打包保存——删除下载到本地的镜像——将封装好的镜像包移动到备份目录
Image_tags=$(cat $Images_File)
for image_tag in $Image_tags;do
image_Name=$(echo $image_tag | awk -F/ '{print $3}' | awk -F: '{print $1}')
image_Lable=$(echo $image_tag | awk -F/ '{print $3}' | awk -F: '{print $2}')
docker pull $image_tag
docker save $image_tag -o $image_Name-$image_Lable.tar
docker rmi $image_tag
mv $image_Name-$image_Lable.tar $Tar_File
done
注