# harbor 架构
## 架构
![harborArchitecture.png](https://b3logfile.com/file/2019/12/harborArchitecture-61bc501a.png)
如上图所示,harbor 包含了6个组件:
- **Proxy:** 例如registry,UI,TokenService,都在Proxy之后。Proxy负责转发从浏览器或docker client的请求到后
台服务。
- **Registry:** 负责存储docker 镜像和docker的pull/push请求。因为Harbor的访问控制,registry会引导client去
tokenService获取一个有效的token来执行pull/push请求
- **Core services:** harbor的核心功能,主要提供一下服务:
+ **UI:** 给用户提供一个图形化界面去管理镜像。
+ **WebHook:** webhook 是registry中的一种机制,因此镜像状态的改变,会做出相应的处理如更新日志,复制等操作
+ **TokenService:** 若请求为携带token,Registry会将请求转发到该服务中进行权限认证
- **job services:** 用于镜像复制,可以将本地镜像复制(同步)到其他harbor实例。
- **log collector:** 日志收集中心
## docker login流程
假设docker部署在`192.168.1.10`上。用户使用docker login命令请求harbor:
```bash
$ docker login 192.168.1.10
在用户输入用户名密码后,docker client 将会发送一个 Get 请求到 192.168.1.10/v2/
。将会按照以下步骤进行:
- 首先请求被 proxy 容器监听的 80 端口接收,nginx 在这个容器中将请求转发到 Registry 容器中
- Registry 容器配置了基于 token 的权限认证,因此会返回一个 401 的状态码,提示 docker client 去指定的 url 获取一个有效的 token
。在 harbor 中这个 url 指向了 Core Services 提供的 token service。 - 当 docker client 接收到错误码,重新发送一个根据 Http 规范的基本认证并在 Header 中嵌入了用户名密码的请求
- 此请求通过转发 80 端口后,Nginx 根据预先配置的规则再次将该请求转发到 UI 容器, token service 在 UI 容器中接收请求,并获取用户名密码
- 获取用户名密码后,token service 进行权限认证(内部数据库/LDAP),若认证通过 则会在 HttpResponse 的 body 中返回一个由私钥生成的 token
至此 docker login 流程结束 docker 会将用户名密码编码后存储到隐藏文件中
docker push 流程
用户登录成功后,一个可以通过 push 命令将 docker 镜像发送到 Harbor:
$ docker push 192.168.1.10/library/hello-world
- 首先,docker client 类似 login 的流程请求 registry,返回一个 token service 的 Url
- 随后,当与 token service 联系时, docker client 提供附加额外的信息来获取该镜像(library/hello-world)push 操作的 token
- 接收到 nginx 转发的请求后,token service 去数据库查询该用户的是否由权限 push 该镜像。如果权限允许,将会对 push 操作的信息进行编码,并使用私钥进行签名,生成 token 返回给 docker client
- 最后,docker client 获取 token 后,发送 push 请求到 registry。Registry 收到请求后用公钥进行解码并验证其内容,如果 registry 发现 token 有效,则镜像开始传数步骤
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于