Intro

之前我们的 docker 镜像是保存在 Azure 的 Container Registry 里的,最近我们自己搭建了一个 docker registry,我们想把之前保存的 Azure 的 Container Registry 的 docker 镜像同步到我们自己的 docker registry 里

实现思路

我们的做法比较简单也比较LOW,但是基本可以满足要求,

我们的做法是

  • 首先获取到源 Registry 里的所有镜像列表
  • 然后逐个获取镜像的 tags
  • 然后依次遍历将对应的镜像拉到本地,然后 docker tag 一下,命名为新的 registry 镜像名称
  • 然后 push docker 镜像到新的 registry
  • 删除下载到本地的镜像和推送到新的 registry 的镜像

后来突然想起来阿里云好像有一个镜像同步工具,https://github.com/AliyunContainerService/image-syncer image-syncer 是一个docker镜像同步工具,可用来进行多对多的镜像仓库同步,支持目前绝大多数主流的docker镜像仓库服务,看介绍还是很棒的,有需要 registry 之间同步镜像的可以试试这个工具,看介绍这个工具不会拉取到本地磁盘,从源 registry 获取镜像数据之后直接就推送到新的 registry 里了,效率会高很多

Docker-Registry API

docker registry 有一套规范,可以查阅 https://docs.docker.com/registry/spec/api/ 了解更多

获取所有镜像

docker registry v2 新增了一个 _catalog 的 api 可以获取所有的镜像,v1 可以用 _search 来代替

语法如下:

GET /v2/_catalog

默认最多返回100条记录,多余 100 可以通过参数 n 指定返回数量,分页的话可以指定另外一个参数 last指定完上一页返回的最后一个镜像,举个栗子: http://example.com/v2/_catalog"text-align: center">docker registry 镜像同步的实现思路

获取镜像的 tag 列表

调用 tags/list 接口获取镜像的 tag

http :5000/v2/busybox/tags/list
http :5000/v2/redis/tags/list

docker registry 镜像同步的实现思路

PowerShell 脚本

一切不是自动化的运维都是耍流氓,很有可能以后会有类似的需求,不如写个脚本自动化的跑吧

下面的脚本做了一些简化,因为我们的 azure container registry 上的数量不多,只有五六十个镜像,而且镜像只有 latest 的 tag,没有其他 tag ,所以把上面的步骤做了简化,并没有分页获取所有的镜像,也没有获取所有的 tag,实际使用的话还请自行修改后使用

# variables
$srcRegUser = "xxx"
$srcRegPwd = "111111"
$srcRegHost = "xxx.azurecr.cn"
$destRegUser = "yyy"
$destRegPwd = "222"
$destRegHost = "registry.xxx.com"

# get repositories from source registry
# httpie
$response = (http -b -a "${srcRegUser}:${srcRegPwd}" "https://${srcRegHost}/v2/_catalog") | ConvertFrom-Json
# curl
#$response = (curl -u "${srcRegUser}:${srcRegPwd}" "https://${srcRegHost}/v2/_catalog") | ConvertFrom-Json
# repository
$repositories = $response.repositories

#
Write-Host $repositories

# login source registry
docker login $srcRegHost -u $srcRegUser -p $srcRegPwd
# login dest registry
docker login $destRegHost -u $destRegUser -p $destRegPwd

# sync
foreach($repo in $repositories)
{
  Write-Host "sync $repo begin"

  $srcTag = "${srcRegHost}/${repo}:latest"
  $destTag = "${destRegHost}/${repo}:latest"

  Write-Host "source image tag: $srcTag"
  Write-Host "dest image tag $destTag"

  Write-Host "docker pull $srcTag begin"

  docker pull $srcTag

  Write-Host "docker pull $srcTag completed"

  Write-Host "docker tag $srcTag $destTag ing"

  docker tag $srcTag $destTag

  Write-Host "docker push $destTag begin"

  docker push $destTag

  Write-Host "docker push $destTag completed"
  
  Write-Host "docker rmi $srcTag $destTag begin"

  docker rmi $srcTag $destTag

  Write-Host "docker rmi $srcTag $destTag end"

  Write-Host "sync $repo completed"
}

Write-Host "Completed..."

More

如果要同步的镜像比较多,考虑使用阿里云的镜像同步工具去同步

Reference

https://stackoverflow.com/questions/31251356/how-to-get-a-list-of-images-on-docker-registry-v2

https://github.com/AliyunContainerService/image-syncer

https://docs.docker.com/registry/spec/api/

总结

广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!