提到registry v2,主要改进是支持并行pull镜像,镜像层id变成唯一的,解决同一个tag可能对应多个镜像的问题等等。如果还不太了解,可以且听我细细道来。

首先不得不说的是v2 新加了一个概念Digest

他是基于内容进行寻址(Content-addressable)算法算出来的一串hash值。简单的说就是内容不同,得出了的digest值是不同的,但是内容相同的话,得出的digest值是一定相同的。我们的每个镜像层id就是根据每个镜像层的内容得出来的digest的。

所以你在改动镜像层以后生成的digest就不同了,而不动的话,这个digest还是不变的,那么这个digest id是什么时候生成的呢?我们在本地构建镜像时生成的镜像层id每次都是不一样的,这个digest是我们在push镜像时生成的。

为了验证内容相同,push到registry得到的digest相同,我做了个小实验,用如下Dockerfile 注释掉第三行和不注释构建了两次镜像,再push到registry

如果是v1的话,push上去得到的层id肯定是不一样的,但是v2里面,注释第三行得到了5个镜像层,不注释掉第三行得到了6个镜像层,并且第一次的5个层都包含在第二次6个里面。所以得出结论这个digest确实是根据内容生成的。

接下来说一下镜像的id

镜像id也是生成了一个digest值,镜像id是根据_manifest这个文件,也就是镜像层id和镜像名字等一些其他信息生成的digest。我们在每次向v2 push镜像时候,最后都会返回给docker client一个digest值,这个值就代表了镜像的digest id。这个id的作用就是可以指定唯一的镜像了。类似tag使用。

因为我们知道v1时候用tag有个弊病就是多次构建的镜像可以使用同一个tag,导致我们用tag标识镜像的时候可能并不是我们想要的,而用了digest就不会出现这种问题。

我们在写Dockerfile的时候引用镜像就可以这么用:

FROM localhost:5000/test@sha256:ac81211548c0d228e10daaf76f6e0024e5f91879c8a7e105e777d6f964270449

像使用tag一样,用本地docker查看镜像digests时候可以使用:docker images --digests,

当然,目前来说你看到的都是,我们需要从registry上pull下来,使用

docker pull localhost:5000/test@sha256:ac81211548c0d228e10daaf76f6e0024e5f91879c8a7e105e777d6f964270449

了解了digest,我们来看一看registry的存储结构

这部分最好可以对着registry的文件夹结构来看。简单的画了个草图。

是v2的文件夹层级关系

这个是目录下具体的样子,可以先看一会儿,可以看到registry 下面有两个文件夹blobs和repositories,

blobs下面存储了registry的所有基本信息元素,包括镜像层digest和镜像digest,之后在通过某种方式将调用这里的信息。

blobs文件夹下面先分了一个等级,是digest的前两位字符组成的文件夹为了筛选digest,避免了这个文件夹太大,查看时都难。这样方便定位。每个blob里都有一个data文件,存储相关信息。

repositories下面存储的是各个镜像名字命名的文件夹,进入一个镜像文件夹后,可以看到三个子文件夹,_layers, _manifests, _uploads,_layers这个文件夹是跟这个镜像有关的所有镜像层,进入其中一个镜像层文件夹,下面只有一个文件--link命名的文件,里面的内容就是一个digest。

这就跟blobs下面的镜像层建立起了联系,在repositories这个文件夹下,都是通过link文件与blobs文件夹下的文件建立的联系。

_upload这个文件夹,平时点进去是空的,这个文件夹主要作用是上传用的。我们上传镜像层的时候,先上传到这个文件夹下,等完成传输以后,在将这个文件夹下的内容移动到blobs下面,然后将原来的文件删除。

_manifest这个文件夹非常重要,是镜像的相关信息。他下面有两个子文件夹,revisions和tags,revisions这个文件夹下是这个镜像的所有可用的镜像digest,里面的link文件指向了镜像的digest。我们去blobs里面找相应的id对应的文件,查看文件下面的data,我们发现这个data文件里面存储的信息,和我们通过registry v2 rest api请求manifest信息相同~在看_manifest/tags/。下面就是这个镜像的不同tag了。又分了current和index分别表示当前tag对应的digest和此tag下的所有镜像digest。

下面来介绍一下如何搭建token验证的registry

先看一下官方给的图

可以看到,v2和v1相比,访问形式完全变了,去掉了index server,加上了一个auth server。

访问顺序是这样的

我们通过docker client让docker deamon先访问registry,registry如果不需要身份验证,则直接返回结果,若需要验证,返回401并在header附带一些信息,

daemon根据信息访问auth server。auth server判断通过了验证,并返回给daemon一串token。

daemon带着这串token再去访问registry则可以获得到信息,pull ,push,api都走的这套流程。

接下来贴下我的配置文件config.yml,配置了选项auth/token表示要token验证。这个流程确实需要好好读一下,跟她的加密方式有很大关系

version: 0.1

log:

fields:

service: registry

storage:

cache:

blobdescriptor: redis

filesystem:

rootdirectory: /var/lib/registry

http:

addr: :5000

secret: randomstringsecret

tls:

certificate: /root/sslkeys/domain.crt

key: /root/sslkeys/domain.key

auth:

token:

realm: https://registry.tenxcloud.com:5001/auth

service: test123.tenxcloud.com:5000

issuer: qwertyui

rootcertbundle: /root/sslkeys/domain.crt

当然,我是通过容器启动的v2,把这个config volume进去的

我的启动命令:docker run -d -p 5000:5000 --restart=always --name registry -v pwd/sslkeys:/root/sslkeys -v pwd/config.yml:/etc/docker/registry/config.yml -v pwd/data:/var/lib/registry registry:2.1.1

auth/token下的4个子选项都是必须配置的,realm表示我的auth server地址,service表示的registry的地址,issuer是一串标示符,随便写一下,auth server加密的时候也需要配置同样的字符串。rootcertbundle配置一个秘钥,对token进行加密。(我这里复用了我的tls token)

当我们第一次未带token访问registry时会返回401并附带如下信息:Www-Authenticate: Bearer realm="test123.tenxcloud.com:5000 ",service="test123.tenxcloud.com:5000 "scope="repository:husseingalal/hello:push",realm和service就是前面说的,scope表示的是我要做的操作,repository代表镜像,接着是镜像名字,然后是pull或者是push或者二者都有

知道了各个参数的功能,就可以搭建我们的auth server了,我从github下找到了一个项目:https://github.com/cesanta/docker_auth

用go语言写的,其中的账号密码存储方式有:写入文件,ldap和google账号的。这个server实现了动态加载配置文件,配置文件有变化这个server会进行安全的重启,所以可以对文件动态添加账号密码。当然也可以自己写身份验证,添加数据库等方式的,只需要继承Authenticator这个interface就可以。添加起来很容易。身份验证后有权限控制acl,并且我们也可以自定义权限控制,继承Authorizer这个interface即可。

前两项通过后就是生成token(这一部分这个项目已经封装好了,不用改动),

v2的token采用的JWT加密方式,JWT分了三个部分,header,payload,signature,header里面带的信息是token加密方式,一般都是base64, payload里带的都是需要的基本信息,user,权限,过期时间,还有前面说的issure 等等,

signature是header+payload后用秘钥进行加密,这个秘钥就是配置在registry里的rootcertbundle对应的秘钥。

三部分通过 . 连接, 因为有秘钥加密,保证了token信息不会被窜改,这种加密方式保证了将权限验证和registry分离也 是安全的, 将token发送回daemon后daemon就可以带着token去正常访问registry了,如果是rest api,直接将其写成Bearer token就可以请求了。

有疑问加站长微信联系(非本文作者)

go token验证_registry v2 解析以及如何实现token验证相关推荐

  1. golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用

    RSA算法 token生成与解析 本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中. 下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种. 通过 ...

  2. iOS逆向之深入解析App签名的双向验证机制和原理

    一.非对称加密 通常说的签名就是数字签名,它是基于非对称加密算法实现的. 对称加密是通过同一份密钥加密和解密数据,而非对称加密则有两份密钥,分别是公钥和私钥,用公钥加密的数据,要用私钥才能解密,用私钥 ...

  3. ImageNet-1k分类数据集中英对照表 验证集类别解析

    英文类别: ImageNet的1000个分类名称_It-is-me!的博客-CSDN博客_imagenet分类 中英类别: ImageNet数据集编号对应的类别内容_winycg的博客-CSDN博客_ ...

  4. Kaggle Titanic Challenges 生存预测 数据预处理 模型训练 交叉验证 步骤详细解析

    本博客所有内容均整理自<Hands-On Machine Learning with Scikit-Learn & TensorFlow>一书及其GitHub源码. 看<Ha ...

  5. php授权v2.1,PHP授权验证系统V2.1完整版 带补丁包

    PHP授权验证系统V2.1完整版,域名+IP双重验证 一键更新授权系统 完美无错,带微赞后台一键更新补丁,微米后台一键更新补丁 安装配置说明: 程序复制至根目录 phpmyadmin导入host.sq ...

  6. 【com.getui.push.v2.sdk.common.ApiException: 获取token失败: timestamp is invalid】

    com.getui.push.v2.sdk.common.ApiException: 获取token失败: timestamp is invalid 今天又发现一个奇怪的问题.本地IDEA和Jar都可 ...

  7. 区块链行业报告|从交易流程到Token经济的全方位解析

    来源:36氪研究院 作者:孔德云  36氪研究院  分析师 中国人在干嘛? 首先,目前我国区块链项目只占到了全球的4.6%,相比之下,美国占了36%.由于大环境因素,通过ICO的形式,真正找到落地场景 ...

  8. 前后端分离项目token怎么验证_前后端分离,获取token,验证登陆是否失效

    public classJwtUtils {/*** 密钥*/ private static final String SECRET="xxxx";/*** 默认字段key:exp ...

  9. 接受的token无法改变_基于BCH的新Token方案SLP的原理与应用

    2017年,ETH催生了一套Token体系,Token得到广泛应用,一年有几千个币种上线交易所,从而造就了一波牛市.到目前为止,数字货币,除了当做转账工具,如跨国转账,现金收款等,还有另外一个用途就是 ...

最新文章

  1. SpringBoot第七篇:springboot开启声明式事务
  2. Java新手,强烈不建议你用 a.equals(b) 判断对象相等!
  3. java 类的合成_Java设计模式-合成模式
  4. excel转kml工具_CAD+Excel还能这样玩?你用对了嘛!
  5. 有开电商的集合了,了解Water Pamola通过恶意订单对电商发起攻击
  6. cuda-convnet在Ubuntu12.04+CUDA5.5下的配置
  7. Java核心类库篇4——集合
  8. 将两个数组首尾相连c语言,一个百度笔试中的首尾相连的珠子问题解法
  9. Kibana:Heatmap 可视化介绍及 how-to
  10. sybase如何配置monitor
  11. 香港科技大学理学院数据建模硕士学位项目MSc DDM 项目介绍×申请指南
  12. ⚡自组织映射(SOM)神经网络⚡Python实现 |Python技能树征题
  13. 双容水箱液位串级控制系统的设计
  14. 微信收藏保存服务器,微信的收藏和保存功能有啥区别?
  15. 找不到Break键怎么Quit / 退出服务CTRL-BREAK怎么输入啊?/ 笔记本键盘上没有break键
  16. Trojan Killer(木马查杀工具)官方版
  17. ls、du命令的用法
  18. SN74LVC2G04DRLR 德州仪器TI 反相器
  19. 【ROM制作工具】如何三分钟学会制作手机线刷包?一键制作线刷包详细教程
  20. 基于codewarrior10.x的VxWorks bootrom调试 DDR3 SDRAM调试

热门文章

  1. 【渝粤教育】国家开放大学2018年春季 0507-21T非线性编辑 参考试题
  2. 【渝粤教育】国家开放大学2018年秋季 0233-21T学前儿童语言教育 参考试题
  3. [渝粤教育] 西南科技大学 服务管理 在线考试复习资料
  4. 【渝粤题库】国家开放大学2021春2019统计学原理题目
  5. 新一代蓝牙对工业物联网(IIOT)的应用
  6. java怎么使异常不起作用_java – @Test(expected = Exception.class)对我不起作用,我错过了什么?...
  7. php变量 声明提升,TypeScript:let和const变量声明
  8. ajax post提交特殊字符,如何利用jQuery post传递含特殊字符的数据
  9. icom对讲机写频线定义_小米对讲机Lite体验:小米全新5公里无网络免费通话神器...
  10. oracle 10g 分区管理,Oracle 10g分区表的自动维护