1、为什么要删除私有镜像仓库中镜像?
1.1、如何搭建私有镜像仓库
请参考
基于registry镜像构建本地镜像仓库
1.2、需要删除镜像的场景
比如,要编译k8s,需要kube-cross镜像,当前最新的版本V1.13.6-1
而编译k8s 1.17.0需要 V1.13.4-1
可能在上传镜像到私有镜像仓库的时候将V1.13.6-1的kube-cross tag成了V1.13.4-1,编译k8s的时候,出现版本不匹配导致编译失败
此时就需要删除私有镜像仓库中的kube-cross版本
# docker tag 192.168.166.180:50500/kube-cross:v1.13.6-1 192.168.166.180:50500/kube-cross:v1.13.4-1
# docker push 192.168.166.180:50500/kube-cross:v1.13.4-1
The push refers to repository [10.43.166.180:50500/kube-cross]
4bd71a18d78f: Layer already exists
022eea37cee0: Layer already exists
7e34d1e37033: Layer already exists
24af9960442d: Layer already exists
271b7f26a286: Layer already exists
64cbc4bfc2f3: Layer already exists
ec13f1004587: Layer already exists
e5abe1112ca1: Layer already exists
efdff2422869: Layer already exists
3d6d182dab88: Layer already exists
e6d60910d056: Layer already exists
b52c1c103fae: Layer already exists
6f1c84e6ec59: Layer already exists
dd5242c2dc8a: Layer already exists
v1.13.4-1: digest: sha256:df0a50772214025040ea31144a731b5fa76944cbfc9c87db05af98e4aa39aa7f size: 3274
还有可能是镜像仓库满了,需要删除一些不需要的或者版本比较老的镜像
2、删除镜像
2.1、查看镜像列表
> curl http://192.168.166.180:50500/v2/_catalog
{"repositories":["debian-base-amd64","debian-iptables-amd64","kube-cross","registry"]}
2.2、修改registry容器配置文件
registry v2版本的镜像,默认是不允许删除镜像的,所以需要修改配置文件,使能删除方法
2.2.1、查看registry容器ID
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d697e31fae97 registry "/entrypoint.sh /etc…" 41 hours ago Up 41 hours 0.0.0.0:50500->5000/tcp local-registry
2.2.2、查看配置文件
# docker exec -it d697e31fae97 cat /etc/docker/registry/config.yml
version: 0.1
log:
fields:
service: registry
storage:
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
2.2.3、修改配置文件
增加 delete段,将enabled设置为true
# docker exec -it d697e31fae97 vi /etc/docker/registry/config.yml
2.2.4、查看修改后的配置文件
# docker exec -it d697e31fae97 cat /etc/docker/registry/config.yml
version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
delete:
enabled: true
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
2.2.5、重启容器生效配置
# docker restart d697e31fae97
d697e31fae97
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d697e31fae97 registry "/entrypoint.sh /etc…" 41 hours ago Up 3 seconds 0.0.0.0:50500->5000/tcp local-registry
2.2、获取镜像摘要信息
# curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -X GET http://192.168.166.180:50500/v2/kube-cross/manifests/v1.13.4-1
HTTP/1.1 200 OK
Content-Length: 3274
Content-Type: application/vnd.docker.distribution.manifest.v2+json
Docker-Content-Digest: sha256:df0a50772214025040ea31144a731b5fa76944cbfc9c87db05af98e4aa39aa7f
Docker-Distribution-Api-Version: registry/2.0
Etag: "sha256:df0a50772214025040ea31144a731b5fa76944cbfc9c87db05af98e4aa39aa7f"
X-Content-Type-Options: nosniff
Date: Wed, 18 Mar 2020 09:51:02 GMT
2.3、删除镜像
# curl -I -X DELETE http://192.168.166.180:50500/v2/kube-cross/manifests/sha256:df0a50772214025040ea31144a731b5fa76944cbfc9c87db05af98e4aa39aa7f
HTTP/1.1 202 Accepted
Docker-Distribution-Api-Version: registry/2.0
X-Content-Type-Options: nosniff
Date: Wed, 18 Mar 2020 09:52:08 GMT
Content-Length: 0
2.4、检查镜像已经不存在
# curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -X GET http://192.168.166.180:50500/v2/kube-cross/manifests/v1.13.4-1
HTTP/1.1 404 Not Found
Content-Type: application/json; charset=utf-8
Docker-Distribution-Api-Version: registry/2.0
X-Content-Type-Options: nosniff
Date: Wed, 18 Mar 2020 09:53:05 GMT
Content-Length: 99
2.5、参考流程
2.5.1、远程删除镜像
1.远程查找镜像 curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -X GET http://ip:端口/v2/镜像名称/manifests/tag名称
> curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -X GET http://101.43.162.5:5000/v2/jf-note/manifests/latest
HTTP/1.1 200 OK
Content-Length: 2007
Content-Type: application/vnd.docker.distribution.manifest.v2+json
Docker-Content-Digest: sha256:8bdeacd88b4a1ee75ae7e687d8575da638f0881957b8d18e9cd24f299f1414b7
Docker-Distribution-Api-Version: registry/2.0
Etag: "sha256:8bdeacd88b4a1ee75ae7e687d8575da638f0881957b8d18e9cd24f299f1414b7"
X-Content-Type-Options: nosniff
Date: Mon, 06 Feb 2023 05:48:42 GMT
2. 删除镜像 curl -I -X DELETE http://ip:端口/v2/镜像名称/manifests/查找后的镜像id
> curl -I -X DELETE http://101.43.162.5:5000/v2/jf-note/manifests/sha256:8bdeacd88b4a1ee75ae7e687d8575da638f0881957b8d18e9cd24f299f1414b7
HTTP/1.1 202 Accepted
Docker-Distribution-Api-Version: registry/2.0
X-Content-Type-Options: nosniff
Date: Mon, 06 Feb 2023 05:51:44 GMT
Content-Length: 0
2.5.2、删除registry
1.进入容器 docker exec -it 容器名称 sh
> docker exec -it registry2 sh
2. 查找镜像 find . -name "*搜索内容*"
> find . -name "*note*"
./var/lib/registry/docker/registry/v2/repositories/note
3. 删除镜像 rm -r 路径
> rm -r ./var/lib/registry/docker/registry/v2/repositories/note
3、可能遇到的问题
3.1、无删除权限
Method Not Allowed
# curl -I -XDELETE http://192.168.166.180:50500/v2/kube-cross/manifests/sha256:1ca2db35badb4e5ab64ff6478ad550514234e97dcfae3bbfe688b40278c99fc0
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: Wed, 18 Mar 2020 09:28:50 GMT
Content-Length: 78
原因是默认情况下,delete方法没有enable
可以参考2.2节修改
3.2、没有找到镜像
# curl -I -XDELETE http://192.168.166.180:50500/v2/kube-cross/manifests/sha256:1ca2db35badb4e5ab64ff6478ad550514234e97dcfae3bbfe688b40278c99fc0
HTTP/1.1 404 Not Found
Content-Type: application/json; charset=utf-8
Docker-Distribution-Api-Version: registry/2.0
X-Content-Type-Options: nosniff
Date: Wed, 18 Mar 2020 09:43:22 GMT
Content-Length: 70
原因可能是获取的摘要不对
registry v2 版本获取摘要的命令需加上这个header
–header “Accept: application/vnd.docker.distribution.manifest.v2+json”