Docker Registry

By | 2021年12月31日

1 Docker Registry的组成

Docker Registry由三部分组成,分别是 index、registry和registry client。

  • index 负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。它使用以下组件维护这些信息:Web UI、元数据存储、认证服务、符号化。
  • registry 是镜像和图表的仓库。然而,它没有一个本地数据库,也不提供用户的身份认证,由S3、云文件和本地文件系统提供数据库支持。此外,通过Index Auth service的Token方式进行身份认证。Registries可以有不同的类型。现在让我们来分析其中的几种类型:
    (1) Sponsor Registry:第三方的registry,供客户和Docker社区使用。
    (2) Mirror Registry:第三方的registry,只让客户使用。
    (3) Vendor Registry:由发布Docker镜像的供应商提供的registry。
    (4) Private Registry:通过设有防火墙和额外的安全层的私有实体提供的registry。
  • registry client Docker充当registry客户端来负责维护推送和拉取的任务,以及客户端的授权。

2 安装

2.1 run 方式安装

docker pull registry:2
docker run -d --name falregistry -p 5000:5000 --restart always registry:2

2.2 compose 方式安装

docker service create \
--name falregistry \
--publish published=5000,target=5000 \
--mount type=volume,source=fal-registry,destination=/var/lib/registry \
registry:2

2.3 查看所有镜像

我在 192.168.1.220上装的registry,现在查看下仓库里的镜像:

[admin@localhost ~]$ curl http://127.0.0.1:5000/v2/_catalog
{"repositories":[]}

由于刚安装好,没有任何镜像!
经测试,内网的其他机器若想查看仓库里的镜像,只需要使用curl http://192.168.1.220:5000/v2/_catalog,不需要做任何设置,但若想要 pull镜像,默认是会报错的。

3 上传镜像

# 从官方仓库下载一个镜像来测试
docker pull ubuntu
# 然后标记本地镜像,将其归入 falregistry 仓库
docker tag ubuntu 127.0.0.1:5000/ubuntu
# 上传镜像
docker push 127.0.0.1:5000/ubuntu
# 查看所有镜像
curl http://127.0.0.1:5000/v2/_catalog
# 本地下载已上传的镜像(先删除已存在的)
docker pull 127.0.0.1:5000/ubuntu

上面使用tag标记后,会多出个镜像,但共享同一段数据:

[admin@localhost ~]$ docker image ls
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
127.0.0.1:5000/ubuntu   latest              93fd78260bd1        5 weeks ago         86.2MB
ubuntu                  latest              93fd78260bd1        5 weeks ago         86.2MB

4 下载镜像(非本地)

下面我们另找台机器,与安装仓库的机器组成swarm,此时经过测试,可以直接用docker pull 127.0.0.1:5000/ubuntu获取镜像,应该swarm进行了NAT地址转换了。但是我们不能用docker pull 192.168.1.220:5000/ubuntu会报错:Error response from daemon: Get https://192.168.1.220:5000/v2/: http: server gave HTTP response to HTTPS client,这是由于Registry为了安全性考虑,默认是需要https证书支持的。

非swarm环境下,我们只能指定具体的IP来下载镜像,该怎么办呢?其实,我们可以通过一个简单的办法解决:添加或修改 /etc/docker/daemon.json文件:

{
    "insecure-registries" : ["192.168.1.166:8083", "192.168.1.220"]
}

修改好后,重启docker,就可以下载镜像了:

docker pull 192.168.1.220:5000/ubuntu

5 其他Docker Registry

除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,VMWare Harbor 和 Sonatype Nexus。

发表评论

您的电子邮箱地址不会被公开。