继开源项目Elastic Shell发布以后,晴耕工坊近期又有新品发布啦!今天,我们就一起来了解一下Docker Registry CLI这款开源小工具。

什么是Docker Registry CLI

我们知道,Docker Registry(Docker注册表)是一项服务,用于存储Docker Image(镜像)。例如大家所熟知的Docker HubQuayGoogle Container RegistryAWS Container Registry等,就属于Public Docker Registry。此外,我们也可以搭建属于自己的Private Docker Registry。

Docker Registry CLI是一款用Bash Shell编写的命令行工具,可以方便而灵活的对支持HTTP API V2版本的Docker Registry进行管理,同时支持公有和私有的Docker Registry。它具备了以下几个特色:

  • 批量复制:作为该工具的一大特色,利用其cp命令,可以从多个公有及私有Registry批量复制Image,轻松搭建起属于自己的Docker Registry;
  • 基于DIND:提供基于Docker-in-Docker(DIND)的运行模式,支持容器内执行docker命令,所有操作对宿主机Registry缓存均不会造成任何影响;
  • 强大灵活:只通过少数几个命令及其参数的组合,就完成了针对Image,Tag,Digest,Manifest在内的各种查询,以及Image的复制删除操作;
  • 简单易学:由于在设计上极大程度的借鉴了Linux常用命令的语法,因而很容易上手。只要了解cp, ls, rm等命令,就可以很快掌握使用方法;

接下来我们就一起来看看,如何借助Docker Registry CLI快速搭建一个Private Docker Registry!我们将从中进一步体会到该工具的上述几个特点。

如何运行

Docker Registry CLI提供了三种运行方式。

  • 在Docker容器内运行:从Docker Hub上抓取Image到本地,就可以在容器内运行Docker Registry CLI了。这是最便捷的一种运行方式,因为容器内预装了所有该工具执行的先决依赖,包括:bashcurljqdocker
  • 在Docker容器外运行:当然,我们也可以选择从GitHub库下载源码,在本地的宿主机器上直接运行。只要在运行之前,确保本机已经安装了工具所需的所有先决依赖即可。
  • 利用Docker Compose:此外,我们还可以将GitHub库完整克隆到本地,并通过执行docker-compose命令来运行。本质上,这也属于容器内运行。只不过预先配置好的docker-compose.yml里,除了Docker Registry CLI本身外,还包含一个hostname为mr.io的Private Docker Registry,可以用来做实验。本文后面的演示,都将采用这一运行方式。

使用Docker Compose

利用Docker Compose运行Docker Registry CLI非常简单。只需要两步即可:

  • 第一步:将GitHub库克隆到本地后执行如下命令,以同时启动Docker Registry CLI的Daemon服务及mr.io
$ docker-compose up -d
Creating network "net-registry" with driver "bridge"
Creating docker-registry-cli-v0_reg-cli_1_d4de93c59ec0 ... done
Creating mr.io                                         ... done
  • 第二步:执行如下命令,通过另一个容器连接至Docker Registry CLI的Daemon服务:
$ docker-compose exec reg-cli bash

进入容器后,我们就可以通过执行reg-cli命令运行Docker Registry CLI了!

首先,我们利用reg-cli ls命令查看一下mr.io的Catalog:

bash-4.4# reg-cli ls mr.io
mr.io
---------------------------------------

返回结果显示,目前mr.io上还没有任何Image。别急,接下来我们将通过Docker Registry CLI把来自其他Registry的Image复制到mr.io上!当然,我们也可以利用docker push命令直接往mr.io上推送Image。

复制第一个Image

向Docker Registry复制Image,需要用到reg-cli cp命令。利用它,可以将存储于其他Registry(包括公有和私有)的Image批量复制到目标Registry。

我们先来试一下把Docker Registry CLI自身的Image从Docker Hub上抓取下来并推送到mr.io。执行如下命令:

bash-4.4# reg-cli cp morningspace/docker-registry-cli mr.io

等待命令执行完毕后,再利用reg-cli ls查看mr.io的Catalog:

bash-4.4# reg-cli ls mr.io
mr.io
---------------------------------------
docker-registry-cli

恭喜你!我们的第一个Image已经成功复制到mr.io了!在reg-cli ls后面加上Image的全名,可以列出该Image位于mr.io上的所有Tag:

bash-4.4# reg-cli ls mr.io/docker-registry-cli
mr.io/docker-registry-cli
---------------------------------------
latest

目前为止,我们的docker-registry-cli只有一个latest的Tag。再用-ld-lm选项分别查看一下docker-registry-cli的Digest和Manifest吧:

bash-4.4# reg-cli ls mr.io/docker-registry-cli -ld
mr.io/docker-registry-cli
---------------------------------------
sha256:d1b110ad26922d45fce7baccd572ba35eef0412a0af8354177ae742d99718992 latest
bash-4.4# reg-cli ls mr.io/docker-registry-cli -lm
mr.io/docker-registry-cli
---------------------------------------
{
   "schemaVersion": 1,
   "name": "docker-registry-cli",
   "tag": "latest",
   "architecture": "amd64",
   "fsLayers": [
     ...
   ],
   "history": [
     ...
   ],
   "signatures": [
     ...
   ]
}

在容器里执行docker命令

前面提到过,Docker Registry CLI的Image是基于Docker-in-Docker(DIND)制作的。因此,我们可以在Docker Registry CLI所在的容器内运行docker命令!实际上,reg-cli cp的功能就是通过组合多个docker命令的方式实现的。我们在容器里执行docker images命令看看:

bash-4.4# docker images
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
morningspace/docker-registry-cli   latest              84f9cabf011f        10 hours ago        189MB
mr.io/docker-registry-cli          latest              84f9cabf011f        10 hours ago        189MB

上面列出的,就是我们刚才从Docker Hub上抓取到本地的Image,以及要推送到mr.io的Image Tag。而这些Image或者Tag,在宿主机器上是看不到的!DIND技术的神奇之处就在于,所有在容器内进行的操作对宿主机的Registry缓存都不会产生任何影响。当我们完成工作从容器退出后,这些缓存在本地的Image和Tag都将不复存在,从而留给了宿主机一个非常干净的空间。

好了,有关Docker Registry CLI的使用就先介绍到这里了。在下一篇文章中,我们将进一步介绍如何从多个Registry批量复制Image到目标Registry,更加灵活丰富的查询功能,以及如何清理Registry上的Image。

关于Docker Registry CLI,如果你有任何疑问,或者希望通过贡献代码来增强这一工具,欢迎发送邮件至morningspace@yahoo.com。更多详情请访问GitHub库晴耕工坊的主页。


Have fun!

MorningSpace Studio

留下评论

您的电子邮箱地址并不会被展示。请填写标记为必须的字段。 *

正在加载...