文章目录
- 一、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 存储细节
目录分为两层: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
- 效果展示
5.2 添加认证(客户端)
5.3 删除认证(客户端)