Docker系列(五):私有仓库(二)
简介
上一篇讲了使用Registry搭建私有的镜像库,对Registry的管理暂时只能是有API来进行,本篇来介绍使用API管理Registry镜像库。
Registry镜像的管理
1. 镜像查询
前面已经说到过Registry v2需要通过API进行查询, 对于需要证书及鉴权的Registry通过以下方式查询:
$ curl --cacert /etc/docker/certs.d/10.0.2.15\:5000/ca.crt \
--basic --user admin:admin123 \
https://10.0.2.15:5000/v2/_catalog
{"repositories":["registry"]}
可以查看每个镜像的详细信息:
$ curl -i -X GET -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
--cacert /etc/docker/certs.d/10.0.2.15\:5000/ca.crt \
--basic --user admin:admin123 \
https://10.0.2.15:5000/v2/registry/manifests/2
HTTP/1.1 200 OK
Content-Length: 1364
Content-Type: application/vnd.docker.distribution.manifest.v2+json
Docker-Content-Digest: sha256:435db1be85c6c10b2f506516aa14d8c485c1f1bd5f4a941a637808b085f294b6
Docker-Distribution-Api-Version: registry/2.0
Etag: "sha256:435db1be85c6c10b2f506516aa14d8c485c1f1bd5f4a941a637808b085f294b6"
Date: Thu, 09 Nov 2017 22:09:42 GMT
{
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 3165,
"digest": "sha256:a07e3f32a779aa924fd47f6797d4d5c93061c50c0eb97d464f08365a3a30200b"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 2385012,
"digest": "sha256:49388a8c9c86a6f56d228954eede699c64fce6c671a989e3e21c391859694645"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 2027027,
"digest": "sha256:e4d43608dd22de7d12f17ae419ce146094e047e1a739d644e3fcb647f9379bdb"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 6265374,
"digest": "sha256:3a41740f900cbba03b223c025f03632db1284d85a696677bca8d6375cdf6040b"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 371,
"digest": "sha256:e16ef4b766841014d6a902f034f0f67698bcbebc1b4c36ff3574d3730e79e2ee"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 213,
"digest": "sha256:65f212f7c77805418cb85461d93a522c1bf4eebac73009ccd23ac2159ac33dad"
}
]
}
对于2.3或之前的版本,要使用:指定Accept: application/vnd.docker.distribution.manifest.v2+json
头。
2. 镜像删除
对于Registry库中镜像的删除,通过API只能删除镜像的信息,具体的镜像的Layer实际还存在。
$ curl -i -X DELETE -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
--cacert /etc/docker/certs.d/10.0.2.15\:5000/ca.crt \
--basic --user admin:admin123 \
https://10.0.2.15:5000/v2/registry/manifests/sha256:435db1be85c6c10b2f506516aa14d8c485c1f1bd5f4a941a637808b085f294b6
HTTP/1.1 202 Accepted
Docker-Distribution-Api-Version: registry/2.0
Date: Fri, 10 Nov 2017 03:46:09 GMT
Content-Length: 0
Content-Type: text/plain; charset=utf-8
这时查看镜像信息显示为未知镜像:
$ curl -i -X GET -H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
--cacert /etc/docker/certs.d/10.0.2.15\:5000/ca.crt \
--basic --user admin:admin123 \
https://10.0.2.15:5000/v2/registry/manifests/2
HTTP/1.1 404 Not Found
Content-Type: application/json; charset=utf-8
Docker-Distribution-Api-Version: registry/2.0
Date: Fri, 10 Nov 2017 03:47:51 GMT
Content-Length: 91
{"errors":[{"code":"MANIFEST_UNKNOWN","message":"manifest unknown","detail":{"Tag":"2"}}]}
但再次上传相同镜像的时候,所有Layer提示已经存在:
$ docker push 10.0.2.15:5000/registry:2
The push refers to a repository [10.0.2.15:5000/registry]
3c133a51bc00: Layer already exists
a2717186d7dd: Layer already exists
656c7684d0bd: Layer already exists
7683d4fcdf4e: Layer already exists
ef763da74d91: Layer already exists
2: digest: sha256:435db1be85c6c10b2f506516aa14d8c485c1f1bd5f4a941a637808b085f294b6 size: 1364
Docker官方文档中描述的API删除镜像其实是软删除,只是解除信息关联,并没有在真正删除镜像,建议调用API删除成功后到镜像存储目录直接删除该镜像所有信息。
调用删除API之前,在config.yml
中需要增加允许删除的配置:
$ vim /etc/docker-distribution/registry/config.yml
... ...
storage:
... ...
delete:
enabled: true
增加配置后重启服务。