一文搭建本地镜像仓

一文搭建本地镜像仓

拉取registry镜像

bash 复制代码
docker pull registry:2

运行registry容器

第1种方式:不加持久化

bash 复制代码
docker run -d -p 5000:5000 --restart=always --name=registry registry:2

第2种方式:对初始化配置文件,加持久化

bash 复制代码
# 创建数据卷,用于挂载
docker create volume registryvolume
docker run -d -p 5000:5000 --restart=always --name=registry -v registryvolume:/etc/docker/registry registry:2

推送镜像

bash 复制代码
docker push ubuntu:22.04

v2支持的所有端点

v2支持的所有端点

Method Path Entity Description
GET /V2/ Base 查看是否支持registry/v2
GET /v2/_catalog Catalog 查看所有的镜像仓库列表
GET /v2/<repository_name>/tags/list Tags 查看存储库中所有的镜像标签
GET /v2/<repository_name>/manifests/ Manifests 获取由摘要或者标签指向的信息
POST /v2/<repository_name>/manifests/ Manifests 上传由摘要或者标签指向的信息
DELETE /v2/<repository_name>/manifests/ Manifests 删除由摘要指向的信息
DELETE /v2/<repository_name>/blobs/ Blob 获取由摘要指向的blob
DELETE /v2/<repository_name>/blobs/ Blob 删除由摘要指向的blob

查询存储库

bash 复制代码
curl -X GET http://localhost:5000/v2/_catalog # 查看所有存储库
curl -X GET http://localhost:5000/v2/_catalog?n=1&last=ImageName # n为每一页的数量,last为一页中最后一个镜像名

获取特定镜像的manifests

bash 复制代码
curl -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -X GET http://localhost:5000/v2/ubuntu/manifests/22.04

如果拿到是v1版本信息,此时去删除镜像,会报404未找到

拿到v2版本信息如下图

Etag是一种Entity对象、HTTP响应头,提供资源的唯一标识符,通常用于缓存和验证机制,确保客户端资源是最新的。

Blob也是一种Entity对象,用于存储镜像的层或其它数据。blob的sha值,用于验证和去重。

根据digest删除特定镜像

bash 复制代码
curl -I -X DELETE http://localhost:5000/v2/ubuntu/manifests/sha256:34782402df238275b0bd100009b1d31c512d96392872bae234e1800f3452e33d

触发垃圾回收

触发垃圾回收,根据已删除的manifests信息,删除blob

bash 复制代码
docker exec -it registry /bin/registry garbage-collect /etc/docker/registry/config.yml