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。