文章目录
参考链接:
官方API的地址: Registry API 使用手册: Docker Registry
一、Docker Registry 部署
-
step1 启动一个 registry
docker run -d -p 5000:5000 \ --name registry --restart=always \ -v /registry:/var/lib/registry \ registry
推送试试:
[root@jumper k8s-deploy]# docker tag registry 192.168.56.10:5000/registry [root@jumper k8s-deploy]# docker push 192.168.56.10:5000/registry The push refers to repository [192.168.56.10:5000/registry] Get https://192.168.56.10:5000/v2/: http: server gave HTTP response to HTTPS client
报错原因:
client 通过 https 协议 push 镜像,但是 server 端使用的是 http 协议,并没有配置 https 协议。
解决方案:
把私有镜像仓库加到信任的仓库列表中,具体配置如下: -
step2 client 指定仓库通过 http 传输数据
vim /etc/docker/daemon.json { "insecure-registries": ["192.168.56.10:5000"] }
-
step3 日常使用
# 打标签 docker tag registry 192.168.56.10:5000/registry # 上传 docker push 192.168.56.10:5000/registry # 拉取 docker pull 192.168.56.10:5000/registry
-
step4 美化化 tag
# 部署 registry 时端口配置为80端口,或做个nginx反代到端口5000(这里不演示) docker run -d -p 80:5000 \ --name registry --restart=always \ -v /registry:/var/lib/registry \ registry # 配置hosts echo 'registry.local' >> /etc/hosts # 配置仓库走http协议 vim /etc/docker/daemon.json { "insecure-registries": ["http://registry.local"] } # 重启docker生效配置 systemctl restart docker # 效果展示 docker tag registry registry.local/registry docker push registry.local/registry
二、Registry API 使用
- 查看API是否可用,返回200 OK代表可用
curl -I -X GET localhost:5000/v2/
- 查看所有镜像
curl -X GET localhost:5000/v2/_catalog
- 获取一个镜像的 manifest
代表镜像名,reference可以使用 tag 或 digestcurl -I -X GET localhost:5000/v2/<name>/manifests/<reference>
- 查看一个镜像是否存在
存在:HTTP/1.1 200 OK 不存在:HTTP/1.1 404 Not Foundcurl -I -X HEAD localhost:5000/v2/<name>/manifests/<reference>
- 下载单个镜像层
curl -X GET localhost:5000/v2/<name>/blobs/<digest>
- 删除一个镜像
不过删除一个镜像需要加一个header,如下:curl -I -X DELETE localhost:5000/v2/<name>/manifests/<reference>
同时还需要在配置中许可删除操作,修改配置文件,在storage下添加delete的许可:curl -I --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -X DELETE localhost:5000/v2/<name>/manifests/<reference>
storage: delete: enabled: tru
三、Registry 存储细节
目录分为两层:blobs 和 repositories:
- blobs:镜像所有内容的实际存储,包括了镜像层和镜像元信息manifest。
- repositories:镜像元信息存储的地方,name代表仓库名称
每个仓库下面又分为_layers、_manifests两个部分:
- _layers负责记录该仓库引用了哪些镜像层文件
- _manifests负责记录镜像的元信息
每个 manifests 又分为revisions、tags两个部分:
- revisions包含了仓库下曾经上传过的所有版本的镜像元信息
- tags包含了仓库中的所有标签
每个tags又分为 current、index 两个部分
- current 记录了当前标签指向的镜像
- index 目录则记录了标签指向的历史镜像
四、补充扩展
4.1 查看镜像列表
[root@jumper repositories]# curl -X GET localhost:5000/v2/_catalog
{"repositories":["nginx","registry"]}
或者
[root@jumper repositories]# ls /registry/docker/registry/v2/repositories
nginx registry
或者
4.2 查看镜像tag
[root@jumper repositories]# curl -X GET localhost:5000/v2/nginx/tags/list
{"name":"nginx","tags":["latest","v3.1"]}
或者
[root@jumper tags]# ls /registry/docker/registry/v2/repositories/nginx/_manifests/tags
latest v3.1
或者
4.3 删除镜像
- step1 进入docker registry的容器中
docker exec -it registry /bin/sh
- step2 删除repo
rm -rf /var/lib/registry/docker/registry/v2/repositories/nginx
- step3 清除掉blob(垃圾回收,有效层会被标记,无效层会被清理)
registry garbage-collect /etc/docker/registry/config.yml
五、registry 认证
5.1 添加认证(服务端)
- 部署认证功能
# 准备 registry 密码文件的存放目录,后续挂载到 registry 容器里面 mkdir -p /opt/registry-var/auth/ # 通过 htpasswd 生成加密后的密码文件 yum -y install httpd-tools htpasswd -Bbn userA 123456 >> /opt/registry-var/auth/htpasswd # 启动容器 docker run -d -p 5000:5000 \ -v /opt/registry-var/auth/:/auth/ \ # 载入密码文件 -v /opt/myregistry:/var/lib/registry \ # 载入原先已上传的images -e "REGISTRY_AUTH=htpasswd" \ -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ registry
- 效果展示