Docker Registry之删除镜像、垃圾回收
<p>Docker仓库在2.1版本中支持了删除镜像的API,但这个删除操作只会删除镜像元数据,不会删除层数据。在2.4版本中对这一问题进行了解决,增加了一个垃圾回收命令,删除未被引用的层数据。本文对这一特性进行了体验,具体步骤如下。</p>
<h1>1、部署镜像仓库</h1>
<h2>(1)启动仓库容器</h2>
<pre><code class="language-bash">docker run -d \
-p 5000:5000 \
--restart=always \
--name registry \
-v /data/config.yml:/etc/docker/registry/config.yml \
-v /data/registry:/var/lib/registry \
registry:2</code></pre>
<p>说明:
在启动仓库时,需在配置文件config.yml中的storage配置中增加delete=true配置项,允许删除镜像,如下配置文件:
cat /data/config.yml</p>
<pre><code class="language-bash">version: 0.1
log:
fields:
service: registry
storage:
delete:
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3</code></pre>
<h2>(2)拉取镜像后上传镜像到私有仓库</h2>
<pre><code class="language-bash">docker pull centos:7
docker tag centos:7 localhost:5000/my-centos:7
docker push localhost:5000/my-centos:7</code></pre>
<p>说明:
1.浏览器访问可以看到自己上传的镜像,URL如下:
<a href="http://172.16.7.199:5000/v2/_catalog">http://172.16.7.199:5000/v2/_catalog</a>
2.上传镜像时记住sha256的值,下面测试删除时会用到,如果不记得可以用命令查看:</p>
<pre><code class="language-bash">docker inspect images_name</code></pre>
<p>3.此时如何使用IP拉到会报错:</p>
<pre><code class="language-bash">docker pull 172.16.7.199:5000/my-centos:7
Error response from daemon: Get https://172.16.7.199:5000/v2/: http: server gave HTTP response to HTTPS client</code></pre>
<h2>(3)查看数据进行仓库容器中,通过du命令查看大小,可以看到当前仓库数据大小为72.6M。</h2>
<pre><code class="language-bash">docker exec -it registry /bin/sh
/var/lib/registry # du -sh /var/lib/registry/
72.6M </code></pre>
<h1>2.删除镜像</h1>
<p>删除registry仓库中的镜像
删除镜像对应的API如下:
DELETE /v2/<name>/manifests/<reference>
name:镜像名称
reference: 镜像对应sha256值,可以用docker inspect localhost:5000/my-centos 命令查看,找到对应的值即可,如下:</p>
<pre><code class="language-bash">"RepoDigests": [
"localhost:5000/my-centos@sha256:e4ca2ed0202e76be184e75fb26d14bf974193579039d5573fb2348664deef76e"
],</code></pre>
<h2>(1)发送请求,删除刚才上传的镜像</h2>
<p>在主机上执行,非在容器内执行</p>
<pre><code class="language-bash">curl -I -X DELETE http://172.16.7.199:5000/v2/my-centos/manifests/sha256:e4ca2ed0202e76be184e75fb26d14bf974193579039d5573fb2348664deef76e
HTTP/1.1 202 Accepted
Docker-Distribution-Api-Version: registry/2.0
X-Content-Type-Options: nosniff
Date: Thu, 19 Nov 2020 01:25:40 GMT
Content-Length: 0</code></pre>
<h2>(2)查看数据大小</h2>
<pre><code class="language-bash">docker exec -it registry /bin/sh
/var/lib/registry # du -sh /var/lib/registry/
72.6M </code></pre>
<p>可以看到数据大小没有变化(只删除了元数据)</p>
<h1>3.垃圾回收</h1>
<h2>(1)进行容器执行垃圾回收命令</h2>
<p>命令:registry garbage-collect config.yml</p>
<pre><code class="language-bash">/var/lib/registry # registry garbage-collect /etc/docker/registry/config.yml
my-centos
0 blobs marked, 3 blobs and 0 manifests eligible for deletion
blob eligible for deletion: sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc
INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/2d/2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc go.version=go1.11.2 instance.id=bb0b15c5-a336-458f-80b0-919d9ffc53ee service=registry
blob eligible for deletion: sha256:8652b9f0cb4c0599575e5a003f5906876e10c1ceb2ab9fe1786712dac14a50cf
INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/86/8652b9f0cb4c0599575e5a003f5906876e10c1ceb2ab9fe1786712dac14a50cf go.version=go1.11.2 instance.id=bb0b15c5-a336-458f-80b0-919d9ffc53ee service=registry
blob eligible for deletion: sha256:e4ca2ed0202e76be184e75fb26d14bf974193579039d5573fb2348664deef76e
INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/e4/e4ca2ed0202e76be184e75fb26d14bf974193579039d5573fb2348664deef76e go.version=go1.11.2 instance.id=bb0b15c5-a336-458f-80b0-919d9ffc53ee service=registry</code></pre>
<h2>(2)查看数据大小</h2>
<pre><code class="language-bash">/var/lib/registry # du -sh /var/lib/registry/
8.0K .</code></pre>
<h2>(3)删除残留目录</h2>
<p>删除对应的镜像目录即可,如:
rm -rf /data/registry/docker/registry/v2/repositories/my-centos</p>
<h2>(4)重启docker registry</h2>
<p>跟gc方式一样,删除镜像之后要重启docker registry,不然还是会出现相同镜像push不成功的问题。</p>
<p>参考资料:
<a href="https://www.cnblogs.com/cherylgi/p/13529983.html">https://www.cnblogs.com/cherylgi/p/13529983.html</a>
<a href="https://www.cnblogs.com/yunpt/p/10382722.html">https://www.cnblogs.com/yunpt/p/10382722.html</a></p>