一、需求
只需要備份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
注🐖:
腳本分為上下兩部分,上部分為獲取Harbor中所有專案下所有的鏡像(含私有專案),下部分為根據獲取到的鏡像清單使用docker執行鏡像下載、打包、清理、tar包移到到鏡像存放目錄等,
3.3、執行鏡像備份腳本
執行腳本前請確保本地的鏡像為空
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
# chmod +x Harback-v2.sh
# sh Harback-v2.sh
對于鏡像較大,腳本執行時間長的,可通過以下命令將腳本放入后臺執行,
# nohup sh Harback-v2.sh &
3.4、定時備份鏡像
每周六晚上10點執行備份
撰寫計劃任務
# crontab -e
0 22 * * 6 cd /root/ && nohup sh Harback-v2.sh &
然后到鏡像備份目錄下查看鏡像包數量與鏡像清單數量是否一致,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/401515.html
標籤:其他
上一篇:【筆記】計算機網路(二)
