docker镜像同步

背景:

当企业想把harbor仓库的docker image 镜像,同步到公有云仓库【阿里云】,或者公有云仓库【阿里云】数据迁移到内部的harbor时,就需要使用skopeo,用来镜像镜像同步。

一、Skopeo介绍

Skopeo是一款用来操作、检查、签署和传输容器镜像及镜像存储库的工具, 支持Linux系统、Windows 和 Macos。
Skopeo(希腊语"远程查看"的意思)是红帽工程师与开源社区携手开发的第一款容器工具。
Skopeo是一个能操作不同格式(包括开放容器计划(OCI)和Docker镜像)容器镜像的轻量级模块化解决方案, 您无需下载包含所有层的完整镜像,就可检查远程镜像仓库中的镜像。

主要功能与特性:

  1. 复制:支持从一个镜像仓库或本地目录复制镜像到另一个镜像仓库或本地目录,同时支持跨不同镜像格式(如Docker V2与OCI)的复制
  2. 删除:能够删除远程镜像仓库中的镜像标签,实现镜像的清理和版本管理。
  3. 检查:无需下载整个镜像即可检查远程镜像的详细信息,包括标签、图层、大小、创建日期等,非常适合在CI/CD流程中进行镜像验证。

次处我们使用【复制】功能,来同步镜像

二、安装Skopeo

下载
https://github.com/lework/skopeo-binary/tags
 
上传文件到虚拟机,改名后安装
mv  skopeo-linux-amd64  skopeo

mv  skopeo  /usr/bin/
chmod +x  /usr/bin/skopeo

测试是否安装
skopeo --version
skopeo version 1.15.2 #这里安装的版本是1.15.2

三、最佳实践

使用脚本进行image镜像同步

#!/bin/bash
src_registry='192.168.1.1:8080'
src_tls_verify='false'
src_username='admin'
src_password='Admin@123'
dest_registry='registry.cn-hangzhou.aliyuncs.com'
dest_tls_verify='false'
dest_username='admin'
dest_password='Admin!123'

skopeo login  $src_registry -u $src_username -p $src_password --tls-verify=$src_tls_verify
skopeo login  $dest_registry -u $dest_username -p $dest_password --tls-verify=$dest_tls_verify


#注意,不同的project项目,要修改相应的名称
project_name='public'

# 获取所有需要同步的仓库(不同的源可能获取仓库列表的接口不一样,当前 Harbor 为 v2.3.2)
image_names_page=`curl http://$src_registry/api/v2.0/projects/$project_name/repositories?page_size=1000&page=1 2>/dev/null`
image_names=`echo $image_names_page | jq ' .[] | .name' | tr -d '"'`


echo "同步的仓库(Sync repo): ${image_names}"
echo "================================"
for i in $image_names
do

echo "同步 ${i} " 
echo "skopeo sync --src docker --dest docker   ${src_registry}/${i} ${dest_registry}/${project_name}"


skopeo sync --retry-times=3 --keep-going --src docker --dest docker ${src_registry}/${i} ${dest_registry}/${project_name} --src-tls-verify=false --dest-tls-verify=false --insecure-policy

done