docker 私有仓库-- registry

文章目录

    • Registry 简介
        • Registry功能
        • 重要组件--Registry API
        • 鉴权机制--Auth Server
        • Registry主要特点
      • registry 搭建

Registry 简介

Registry是一个存放镜像的仓库,它通常被部署在互联网服务器或者云端。
假如我们在公司将一个软件的运行环境制作成镜像,并上传到Registry中,这时就可以很方便地在家里的笔记本上,或者在客户的生产环境上直接从Registry上下载并运行了。当然,对Registry的操作也是与Docker完美融合的,用户甚至不需要知道Registry的存在,只需要通过简单的Docker命令就可以实现下载运行操作。
Docker公司提供的官方Registry叫Docker Hub,这上面提供了大多数常用软件和发行版的官方镜像,还有无数个人用户提供的个人镜像。其实,Registry本身也是一个单独的开源项目,任何人都可以下载后自己部署一个Registry。因为免费的Docker Hub功能相对简单,所以多数企业会选择自己部署Docker Registry后二次开发,或者购买功能更强大的企业版Docker Hub。
从使用来讲,Registry旨在实现镜像的创建、存储、分发和更新等功能。

Registry功能

❏ 镜像存储:
镜像数据存储在Registry后端,与本地镜像存储方式类似,它也分隔成了多个镜像层,放置在各自的目录中,保存成tar包格式。除了镜像数据,Registry还保存了清单文件(manifest)和镜像签名文件(signature)等。
❏ 镜像创建、分发和更新:
本地用户和Registry之间通过Registry API传输镜像。Registry API即一系列HTTP/HTTPS请求,用来发送用户请求到Registry,并接收Registry的响应。在请求和响应中则包含了镜像数据交互。

重要组件–Registry API

Registry API用于Registry和DockerEngine之间的通信,实现Registry镜像分发,是DockerRegistry的重要组成部分。用户对Registry的访问,包括镜像上传、下载、查询和删除等操作,都是通过向Registry发送一系列API请求来实现的。Registry API语句由方法(Method)、路径(Path)和实体(Entity)组成。它负责接收engine的访问请求,实现对Registry后端实体的操作,写入或获取数据及状态。API传输的对象主要包括镜像layer的块数据(blob)和表单(Manifest)
表单(Manifest):是JSON格式的文件,记录镜像的元数据信息,并兼容V1版本镜像信息
表单Manifest的内容形式如下:
docker 私有仓库-- registry_第1张图片

鉴权机制–Auth Server

Registry的私有仓库只允许特定用户访问,这种校验和控制访问权限的任务由Docker Engine、Registry和Auth Server协作完成。外来的Registry HTTP请求由不同的客户端发起,Registry只有验证到请求由哪个用户发起,这次请求访问的资源是否对这个用户开放之后,才会允许请求继续。鉴权认证功能保证了Registry访问安全可控。

Auth Server由Registry开发者部署搭建,Registry完全信任Auth Server;Registry和Auth Server之间以证书(open SSL)作为凭据认证token,Auth Server生成和保存pem证书和秘钥key,Registry导入Server发放的证书;Server把签过用户名的token返回给用户,用户用这个token去Registry作鉴权认证。
鉴权是针对一次完整的push或pull过程的,DockerEngine在push或pull过程中会调用一系列Registry API,鉴权之后产生token,每一次API访问都带有含认证信息的token,Registry就是通过校验token来接受API访问的。

docker 私有仓库-- registry_第2张图片

在镜像上传过程中,带有鉴权功能的整个上传过程描述如下:
首先,用户发起上传请求,请求通过Docker Engine,依照Registry API协议发送给Registry。Engine试图赋给HTTP请求一个鉴权的token;如果没有token,daemon会试图更新(refresh/fetch)一个新的token。请求中包含了一系列的REST API方法(如PUT、GET、DELETE、POST、PATCH等)。因为push和pull的行为包含了这样一组方法,所以在Registry作为HTTP server运行的时候,就会通过方法注册的回调机制来判断方法所对应的后面的资源(digest描述的对象)是不是和从token解析出来的参数匹配。
第二步,如果用户请求没有做过认证并且请求中不带token,则Registry将会返回401 Unauthorized状态,并告诉用户端Auth Server地址,要求用户去认证。
第三步,用户带着Registry返回的信息以及用户证书去访问Auth Server(地址包含在返回信息中)申请token
第四步,Auth Server后端账户系统记录着用户名和密码,获取到当前访问用户的名字和密码后,依照JWT格式生成带有鉴权信息的token返回给用户。密码以密文方式保证安全性,解密通过bcrypt算法,实现平台通常提供了相应的函数库。Auth Server可以通过灵活设计接口来提供一个或者多个认证源,包括基本的本地认证(basic auth),以及第三方账户认证。
第五步,用户带着获取的token再次访问Registry,头信息包含关键字Authorization
第六步,Registry校验token,校验对象包括:❏ Auth Server域名得到Registry认可;❏ token标示符是唯一的;❏ token在有效期;❏ token中访问对象信息和用户访问匹配。校验成功后用户上传获得鉴权,开始上传。

Registry主要特点

❏ 快速上传和下载镜像;
❏ 部署方便;
❏ 后端支持多种分布式云存储方案(如s3、azure)和本地文件系统等,接口以插件方式存在,易于配置;
❏ 拥有完善镜像缓存机制,镜像下载更加快捷。
❏ 以Webhook方式实现的通知系统;
❏ 实现了本地TLS,支持HTTPS安全访问;
❏ 有可配置的认证模块;
❏ 有健康检查模块;
❏ 正在努力让用于管理镜像的清单和摘要文件格式更加清晰,以及更清楚地为镜像打标签;
❏ 设计方案新颖且高性能;
❏ 清单文件(Manifest)作为元数据完整地记录镜像信息;

registry 搭建

1、下载仓库镜像

# docker pull registry    
# docker images

在这里插入图片描述

2、修改daemon.jsp
指明私有仓库的路径 端口和IP,在客户终端设置

# vim /etc/docker/daemon.json
添加私有仓库路径一行:
{
"insecure-registries": ["192.168.188.132:5000"],
"registry-mirrors": ["https://05vz3np5.mirror.aliyuncs.com"]
}

重启docker服务
# systemctl restart docker

3、创建registry容器,开放5000端口
‌进入容器 指定端口 指定挂载

# docker run -d  -p 5000:5000 -v /data/registry:/tmp/registry registry
-p 外端口和内端口
-v 容器挂载,外部目录和内目录,外部路径会被自动创建

宿主机的/data/registry 自动创建挂载到容器中的/tmp/registry
存在容器中的/tmp/registry,实际上存在宿主机的/data/registry中
在这里插入图片描述

4、镜像打标签 (必须设置)

# docker pull nginx	
# docker images
# docker tag nginx:latest 192.168.188.132:5000/nginx
标签  改成你要上传到的指定节点IP 端口 名称

docker 私有仓库-- registry_第3张图片

5、打标签的镜像上传到私有仓库

# docker push 192.168.188.132:5000/nginx
获取私有仓库的列表
# curl -XGET http://192.168.188.132:5000/v2/_catalog

可看到已上传上的镜像
docker 私有仓库-- registry_第4张图片

测试:
删除镜像

# docker rmi nginx
# docker rmi 192.168.190.134:5000/nginx

在这里插入图片描述

6、从私有仓库里下载nginx

# docker pull 192.168.188.132:5000/nginx
# docker images

可看到已上传上的镜像192.168.188.132:5000/nginx,被下载下来了
docker 私有仓库-- registry_第5张图片

步骤:
1: 下载registry镜像 ,简化版的 字符终端,测试环境常用registry
2: 客户端设置daemon.jsp文件 指定私有仓库位置
3: 生成registry容器,开放5000端口
4: 镜像打标签 docker tag 源镜像名 仓库IP:端口/镜像名
5: 上传镜像 docker push 仓库IP:端口/镜像名
6: 下载镜像 docker pull —> docker images 查看

生产环境中常用harbor 私有仓库,有图形化界面 不常用registry

你可能感兴趣的:(docker)