docker-registry私有仓库镜像之查看与删除实现方式
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">查看私有仓库有哪些镜像</a></li><li><a href="#_label1">查看私有仓库镜像的tag</a></li><li><a href="#_label2">删除私有仓库指定镜像</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_0">确认是否开启删除功能</a></li><li><a href="#_lab2_2_1">获取指定镜像的 hash 值</a></li><li><a href="#_lab2_2_2">删除私有仓库中的镜像</a></li></ul><li><a href="#_label3">总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>查看私有仓库有哪些镜像</h2><p>如果私有仓库带有认证,在使用 curl 命令的时候需要带上 -u 参数</p>
<p>使用方法:</p>
<div class="jb51code"><pre class="brush:bash;">curl -XGET -u <仓库用户名>:<用户名密码> http://<仓库ip地址>:<仓库端口>/v2/_catalog</pre></div>
<div class="jb51code"><pre class="brush:bash;">curl -XGET -u admin:admin http://192.168.91.18:5000/v2/_catalog
</pre></div>
<p>输出的格式为 json</p>
<div class="jb51code"><pre class="brush:bash;">{"repositories":["centos","debian","mysql","nginx","php"]}
</pre></div>
<p>如果输出的镜像很多,可以用 python 格式化 json 格式,方便查看</p>
<div class="jb51code"><pre class="brush:bash;">curl -s -XGET -u admin:admin http://192.168.91.18:5000/v2/_catalog | python -m json.tool
</pre></div>
<p>这样看,也会直观很多</p>
<div class="jb51code"><pre class="brush:bash;">{
"repositories": [
"centos",
"debian",
"mysql",
"nginx",
"php"
]
}
</pre></div>
<p class="maodian"><a name="_label1"></a></p><h2>查看私有仓库镜像的tag</h2>
<p>使用方法:</p>
<div class="jb51code"><pre class="brush:bash;">curl -XGET -u <仓库用户名>:<用户名密码> http://<仓库ip地址>:<仓库端口>/v2/<镜像名称>/targs/list</pre></div>
<div class="jb51code"><pre class="brush:bash;">curl -XGET -u admin:admin http://192.168.91.18:5000/v2/centos/tags/list
</pre></div>
<p>输出的格式为 json</p>
<div class="jb51code"><pre class="brush:bash;">{"name":"centos","tags":["latest","7"]}
</pre></div>
<p>如果输出的 tag 很多,可以用 python 格式化 json 格式,方便查看</p>
<div class="jb51code"><pre class="brush:bash;">curl -s -XGET -u admin:admin http://192.168.91.18:5000/v2/centos/tags/list | python -m json.tool
</pre></div>
<p>这样看,也会直观很多</p>
<div class="jb51code"><pre class="brush:bash;">{
"name": "centos",
"tags": [
"latest",
"7"
]
}
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>删除私有仓库指定镜像</h2>
<p class="maodian"><a name="_lab2_2_0"></a></p><h3>确认是否开启删除功能</h3>
<p>如果没有开启,执行删除镜像操作的时候,会返回如下两种结果</p>
<div class="jb51code"><pre class="brush:bash;">{"errors":[{"code":"UNSUPPORTED","message":"The operation is unsupported."}]}
</pre></div>
<div class="jb51code"><pre class="brush:bash;">HTTP/1.1 405 Method Not Allowed
Content-Type: application/json; charset=utf-8
Docker-Distribution-Api-Version: registry/2.0
X-Content-Type-Options: nosniff
Date: Fri, 18 Mar 2022 04:12:22 GMT
Content-Length: 78
</pre></div>
<p>查找 registry 容器</p>
<div class="jb51code"><pre class="brush:bash;">docker ps | grep registry
</pre></div>
<p>以自己实际获取的信息为准</p>
<div class="jb51code"><pre class="brush:bash;">3745255afa90 registry "/entrypoint.sh /etc…" About an hour ago Up About an hour 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp registry
</pre></div>
<p>进入容器</p>
<p>registry 进入容器的终端是 sh</p>
<div class="jb51code"><pre class="brush:bash;">docker exec -it 3745255afa90 sh
</pre></div>
<p>一般都是在 <code>/etc/docker/registry/config.yml</code></p>
<p>registry 镜像里面有 vi 没有 vim</p>
<div class="jb51code"><pre class="brush:bash;">vi /etc/docker/registry/config.yml
</pre></div>
<p>我拉取的 registry 镜像默认没有配置 delete 功能</p>
<div class="jb51code"><pre class="brush:yaml;">version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
# 增加这里的 delete 和 enabled ,注意 yaml 语法格式
# 如果有 delete ,并且 enable 为 true 表示已经开启了删除功能
delete:
enabled: true
http:
addr: :5000
headers:
X-Content-Type-Options:
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
</pre></div>
<p>修改完成后,重启 registry 容器</p>
<div class="jb51code"><pre class="brush:bash;">docker restart 3745255afa90
</pre></div>
<p class="maodian"><a name="_lab2_2_1"></a></p><h3>获取指定镜像的 hash 值</h3>
<p>使用方法</p>
<div class="jb51code"><pre class="brush:bash;">curl --header "Accept:application/vnd.docker.distribution.manifest.v2+json" -I \ -u <仓库用户名>:<用户名密码> http://<仓库ip地址>:<仓库端口>/v2/<镜像名称>/manifests/<镜像 tag></pre></div>
<div class="jb51code"><pre class="brush:bash;">curl -I -XGET --header "Accept:application/vnd.docker.distribution.manifest.v2+json" \
-u admin:admin http://192.168.91.18:5000/v2/centos/manifests/latest
</pre></div>
<p>Docker-Content-Digest 这里就会出现镜像的 hash 值</p>
<div class="jb51code"><pre class="brush:bash;">HTTP/1.1 200 OK
Content-Length: 529
Content-Type: application/vnd.docker.distribution.manifest.v2+json
Docker-Content-Digest: sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc
Docker-Distribution-Api-Version: registry/2.0
Etag: "sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc"
X-Content-Type-Options: nosniff
Date: Fri, 18 Mar 2022 04:06:42 GMT
</pre></div>
<p class="maodian"><a name="_lab2_2_2"></a></p><h3>删除私有仓库中的镜像</h3>
<p>使用方法</p>
<div class="jb51code"><pre class="brush:bash;">curl -I -XDELETE -u <仓库用户名>:<用户名密码> \ http://<仓库ip地址>:<仓库端口>/v2/<镜像名称>/manifests/<获取的 hash 值></pre></div>
<div class="jb51code"><pre class="brush:bash;">curl -I -XDELETE -u admin:admin \
http://192.168.91.18:5000/v2/centos/manifests/sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc
</pre></div>
<p>返回的状态码是 202</p>
<div class="jb51code"><pre class="brush:bash;">HTTP/1.1 202 Accepted
Docker-Distribution-Api-Version: registry/2.0
X-Content-Type-Options: nosniff
Date: Fri, 18 Mar 2022 04:24:23 GMT
Content-Length: 0
</pre></div>
<p>再次查看 centos 镜像的 tag 列表</p>
<div class="jb51code"><pre class="brush:bash;">curl -XGET -u admin:admin http://192.168.91.18:5000/v2/centos/tags/list
</pre></div>
<p>现在只有一个 7 这个 tag 的镜像了</p>
<div class="jb51code"><pre class="brush:bash;">{"name":"centos","tags":["7"]}
</pre></div>
<p class="maodian"><a name="_label3"></a></p><h2>总结</h2>
<p>以上为个人经验,希望能给大家一个参考,也希望大家多多支持琼殿技术社区。</p>
頁:
[1]