docker registry 镜像同步

Intro

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

实现思路

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

我们的做法是

  1. 首先获取到源 Registry 里的所有镜像列表
  2. 然后逐个获取镜像的 tags
  3. 然后依次遍历将对应的镜像拉到本地,然后 docker tag 一下,命名为新的 registry 镜像名称
  4. 然后 push docker 镜像到新的 registry
  5. 删除下载到本地的镜像和推送到新的 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?n=20&last=b

获取镜像的 tag

获取 docker 镜像的 tag 列表可以使用 GET /v2/<repository-name>/tags/list 来获取,也可以分页,类似于上面获取镜像列表,可以通过 nlast 来实现分页加载

操作示例

在本地部署了一个测试用的 docker registry 来做演示,我这里用 httpie 来做测试

获取镜像列表:

调用 _catalog 接口来获取镜像列表

http :5000/v2/_catalog

获取镜像的 tag 列表

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

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

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

docker registry 镜像同步的更多相关文章

  1. 基于docker registry镜像安装私服docker hub

    采用docker registry镜像安装docker私服,通过https://hub.docker.com/_/registry链接搜索registry镜像 1.输入命令:docker pull r ...

  2. 删除docker registry镜像脚本

    使用: 删除指定镜像:/usr/local/bin/delete_docker_registry_image -i 镜像名 删除指定镜像指定标签:/usr/local/bin/delete_docke ...

  3. Docker(十二)-Docker Registry镜像管理

    Registry删除镜像.垃圾回收 Docker仓库在2.1版本中支持了删除镜像的API,但这个删除操作只会删除镜像元数据,不会删除层数据.在2.4版本中对这一问题进行了解决,增加了一个垃圾回收命令, ...

  4. docker registry 镜像删除

    registry:2.5.0版本的镜像,将镜像默认存放在了/var/lib/registry 目录下 /var/lib/registry/docker/registry/v2/repositories ...

  5. 在Ubuntu14.04系统POWER8服务器上搭建Docker Registry服务

    本文描述了如何在POWER8服务器上搭建一个本地化的Docker镜像仓库,主要涉及镜像制作,Docker Registry服务启动等.希望能够对在非X86服务器上搭建Docker仓库的同学提供参考. ...

  6. 搭建docker registry (htpasswd 认证)

    1,拉取docker registry 镜像 docker pull registry 2,创建证书存放目录 mkdir -p /home/registry 3,生成CA证书Edit your /et ...

  7. Docker系列06—基于容器制作镜像并上传到Docker Registry

    本文收录在容器技术学习系列文章总目录 1.制作镜像 1.1 镜像的生成途径 基于容器制作 dockerfile,docker build 本篇主要详细讲解基于容器制作镜像:基于dockerfile 制 ...

  8. docker(五) 使用Docker Registry搭建镜像私服

    1.创建私服 docker run -d --name registry -v /opt/data/registry:/var/lib/registry -p 5000:5000 registry - ...

  9. [转]Ubuntu18.04下使用Docker Registry快速搭建私有镜像仓库

    本文转自:https://blog.csdn.net/BigData_Mining/article/details/88233015 1.背景 在 Docker 中,当我们执行 docker pull ...

随机推荐

  1. DPDK LPM库(学习笔记)

    1 LPM库 DPDK LPM库组件为32位的key实现了最长前缀匹配(LPM)表查找方法,该方法通常用于在IP转发应用程序中找到最佳路由匹配. 2 LPM API概述 LPM组件实例的主要配置参数是 ...

  2. Storm-jdbc-2讲 高级API及Trident

    之前对Storm集成JDBC写了一个简单的demo,最近深度研究了下,代码如下 首先,先写一个抽象类,便于减少代码的重复性: import com.google.common.collect.List ...

  3. JavaDoc文件如何生成

    目录 如何使用 1.通过命令行生成JavaDoc文档 2.IDEA如何配置后生成javadoc文档 javadoc命令是用来生成自己的API文档的 参考信息: @author 作者名 @version ...

  4. PAT-1078 Hashing (散列表 二次探测法)

    1078. Hashing The task of this problem is simple: insert a sequence of distinct positive integers in ...

  5. hdu6090 菊花图

    Rikka with Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  6. HDU2819

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2819 题目大意: 给出一个N*N的0/1矩阵,只能交换整行或者整列,问最少交换多少次可以变成一个主对角 ...

  7. js动态添加iframe,自适应页面宽高

    function showIframe(url,w,h){ //添加iframe var if_w = w; var if_h = h; $("<iframe width='" ...

  8. ShoneSharp语言(S#)的设计和使用介绍系列(6)— 字符串String

    ShoneSharp语言(S#)的设计和使用介绍 系列(6)— 字符串String 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneS ...

  9. Linux中查看磁盘大小、文件大小、排序方法小结

    一,查看磁盘空间大小的命令:dfdf命令用于查看磁盘分区上的磁盘空间,包括使用了多少,还剩多少,默认单位是KB 比如以下命令: df -hl执行结果如下: 执行的结果每列的含义: 第一列Filesys ...

  10. 树莓派3B安装ubuntu mate系统后无法联网

    问题描述:在安装系统的初始化操作时,可以联网,如下图所示: 但是在系统安装结束后,wifi标志处无信号,无法搜索wifi信号. 解决方法:实测有效 直接打开终端(ctrl+alt+t),执行指令:su ...