文章目录

  • 一、Docker Registry 部署
  • 二、Registry API 使用
  • 三、Registry 存储细节
  • 四、补充扩展
  • 4.1 查看镜像列表
  • 4.2 查看镜像tag
  • 4.3 删除镜像
  • 五、registry 认证
  • 5.1 添加认证(服务端)
  • 5.2 添加认证(客户端)
  • 5.3 删除认证(客户端)



参考链接:


官方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
curl -I -X GET localhost:5000/v2/<name>/manifests/<reference>
  • 查看一个镜像是否存在
curl -I -X HEAD localhost:5000/v2/<name>/manifests/<reference>
  • 下载单个镜像层
curl -X GET localhost:5000/v2/<name>/blobs/<digest>
  • 删除一个镜像
curl -I -X DELETE localhost:5000/v2/<name>/manifests/<reference>
  • 不过删除一个镜像需要加一个header,如下:
curl -I --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -X DELETE localhost:5000/v2/<name>/manifests/<reference>
  • 同时还需要在配置中许可删除操作,修改配置文件,在storage下添加delete的许可:
storage:
	delete:
		enabled: tru

三、Registry 存储细节


docker registry url划分 docker registry api_API


目录分为两层: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

或者

docker registry url划分 docker registry api_容器_02

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

或者

docker registry url划分 docker registry api_API_03

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
  • 效果展示

5.2 添加认证(客户端)

docker registry url划分 docker registry api_容器_04

5.3 删除认证(客户端)

docker registry url划分 docker registry api_docker_05