【harbor 学习笔记】harbor 架构及 docker login 流程

本贴最后更新于 238 天前,其中的信息可能已经时异事殊

# harbor 架构
## 架构

![harborArchitecture.png](https://img.hacpai.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/。将会按照以下步骤进行:
dockerLoginProcess.png

  1. 首先请求被 proxy 容器监听的 80 端口接收,nginx 在这个容器中将请求转发到 Registry 容器中
  2. Registry 容器配置了基于 token 的权限认证,因此会返回一个 401 的状态码,提示 docker client 去指定的 url 获取一个有效的 token
    。在 harbor 中这个 url 指向了 Core Services 提供的 token service。
  3. 当 docker client 接收到错误码,重新发送一个根据 Http 规范的基本认证并在 Header 中嵌入了用户名密码的请求
  4. 此请求通过转发 80 端口后,Nginx 根据预先配置的规则再次将该请求转发到 UI 容器, token service 在 UI 容器中接收请求,并获取用户名密码
  5. 获取用户名密码后,token service 进行权限认证(内部数据库/LDAP),若认证通过 则会在 HttpResponse 的 body 中返回一个由私钥生成的 token

至此 docker login 流程结束 docker 会将用户名密码编码后存储到隐藏文件中

docker push 流程

dockerPushProcess.png

用户登录成功后,一个可以通过 push 命令将 docker 镜像发送到 Harbor:

$ docker push 192.168.1.10/library/hello-world
  1. 首先,docker client 类似 login 的流程请求 registry,返回一个 token service 的 Url
  2. 随后,当与 token service 联系时, docker client 提供附加额外的信息来获取该镜像(library/hello-world)push 操作的 token
  3. 接收到 nginx 转发的请求后,token service 去数据库查询该用户的是否由权限 push 该镜像。如果权限允许,将会对 push 操作的信息进行编码,并使用私钥进行签名,生成 token 返回给 docker client
  4. 最后,docker client 获取 token 后,发送 push 请求到 registry。Registry 收到请求后用公钥进行解码并验证其内容,如果 registry 发现 token 有效,则镜像开始传数步骤
  • harbor
    4 引用
  • registry
    4 引用
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    351 引用 • 808 回帖 • 469 关注

赞助商 我要投放

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...