Docker Registry V2 推送镜像、拉取镜像、搜索镜像、删除镜像和垃圾回收

机缘巧合搞了台ARM服务器(华为鲲鹏处理器)于是想试水用用,首先碰到了想搭建一个私有仓库的问题,刚好比较容易的仓库Nexus3、Harbor没有ARM架构的,只有回到原点docker自己的Registry,但其没有一个前段的界面,当然有些第三方的,暂不谈论。那么想要操作管理镜像就是一个很需要解决的问题,看了官方的原文,但有的东西还是要自己实验下才行。不过这方面已经有人总结了,在此就转贴下,个别的地方有些不痛不痒的修改。
原文链接:https://blog.csdn.net/nklinsirui/article/details/80705306

[TOC]

官方文档

Docker Registry HTTP API v2
Garbage collection

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 去搜索镜像,需要通过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 镜像为例。

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

2) 执行以下命令,根据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"

3)垃圾回收
进入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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章