官方文档
Registry操作
推送一个镜像到registry
# docker push <registry_ip>:<registry_port>/<image_name>:<image_tag>
docker push 192.168.37.100:5000/busybox:0.0.1
从registry拉取一个镜像
# docker pull <registry_ip>:<registry_port>/<image_name>:<image_tag>
docker pull 192.168.37.100:5000/busybox:0.0.1
在registry中搜索一个镜像
Registry V2 不支持通过docker search
去搜索镜像。
如果执行下面的命令会遇到“Error response from daemon: Unexpected status code 404” 的错误。
docker search 192.168.37.100:5000/busybox
需要通过Registry V2的REST API去查询。
列出所有的镜像仓库(repositories):
# curl -X GET http://<registry_ip>:<registry_port>/v2/_catalog
curl -X GET http://192.168.37.100:5000/v2/_catalog
输出例子:
{"repositories":["busybox"]}
列出指定镜像的所有标签:
# curl -X GET http://<registry_ip>:<registry_port>/v2/<image_name>/tags/list
curl -X GET http://192.168.37.100:5000/v2/busybox/tags/list
输出例子:
{"name":"busybox","tags":["latest","0.0.1","0.0.2"]}
删除registry中的镜像
删除registry比较复杂,需要先查到指定标签的镜像的digest (sha256校验和),再根据这个digest来删除。
下面以删除192.168.37.100:5000/busybox/:0.0.1 镜像为例。
先执行以下命令找到该镜像的digest:
curl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET http://192.168.37.100:5000/v2/busybox/manifests/0.0.1 2>&1 | grep Docker-Content-Digest | awk '{print ($3)}'
Digest输出例子:
Docker-Content-Digest: sha256:74f634b1bc1bd74535d5209589734efbd44a25f4e2dc96d78784576a3eb5b335
执行以下命令,根据digest删除镜像:
curl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X DELETE http://192.168.37.100:5000/v2/busybox/manifests/sha256:74f634b1bc1bd74535d5209589734efbd44a25f4e2dc96d78784576a3eb5b335
这里的删除镜像只是删除了一些元数据,需要执行下面的垃圾回收才能真正地从硬盘上删除镜像数据。
因为缺省Docker private registry不允许删除镜像,如果遇到“405 Unsupported” 错误,需要在运行registry容器时设置REGISTRY_STORAGE_DELETE_ENABLED环境变量或参数为true。
docker-compose.yaml 例子:
environment:
REGISTRY_STORAGE_DELETE_ENABLED: "true"
docker run
例子:
-e REGISTRY_STORAGE_DELETE_ENABLED="true"
创建Docker private registry可以参考:一键搭建Docker private registry并使用阿里云镜像加速器
垃圾回收
进入registry容器,执行garbage-collect
命令执行垃圾回收。
docker exec -it registry /bin/registry garbage-collect /etc/docker/registry/config.yml
参考文档
- 《Docker容器与容器云》 3.5 Docker镜像管理,3.6.1 Docker镜像元数据管理
- https://stackoverflow.com/questions/31251356/how-to-get-a-list-of-images-on-docker-registry-v2
- https://stackoverflow.com/questions/37033055/how-can-i-use-the-docker-registry-api-v2-to-delete-an-image-from-a-private-regis
- https://stackoverflow.com/questions/25436742/how-to-delete-images-from-a-private-docker-registry
- https://github.com/docker/distribution/issues/1326
- https://github.com/docker/distribution/issues/989