Flux7 Docker 系列教程(四):Registry & Workflows

本系列教程翻译自 Flux7 Docker Tutorial Series,系列共有九篇,本文译自第四篇 Part 4: Registry & Workflows
该系列所有文章将参考其他学习资料翻译,也会加入自己的学习作为部分注解。如有错误,欢迎指正。

clipboard.png

上篇文章介绍了使用 Dockerfile 进行自动化部署和 Dockerfile 的常用命令,本篇文章来探讨 Docker Registry。类似 GitHub,Docker Registry 是用来存储 Docker 镜像的地方。了解 Docker Registry 之前先来了解几个相关的知识吧。

  1. 镜像和仓库和 GitHub 一样,可以被收藏和被 “star”。
  2. 和 GitHub 一样,可以在仓库上面留评论以便和维护人员进行交流。
  3. 和 Github 类似私人仓库不能被搜索到,只有拥有合作者、拥有者权限的用户才能访问。
  4. 推送成功之后可以配置 webhook

Docker Registry 由三个部分组成:Index、Registry、Registry Client。

可以把 Index 认为是负责登录、负责认证、负责存储镜像信息和负责对外显示的外部实现,而 Registry 则是负责存储镜像的内部实现,而 Registry Client 则是 Docker 客户端。

Docker Hub 架构

Docker Index

Docker Index 使用以下工具来维护用户信息、校验镜像、以及维护公共 namespace:

  1. 网页界面
  2. 元数据存储
  3. 认证服务
  4. 令牌化

同时 Docker Index 也用来分解 URL,方便用户认证和用户使用。

Registry

Registry 用来存储镜像和统计数据。然而它不会提供数据库服务,即它不会提供用户认证服务,由 S3、云文件和本地文件系统提供数据库支持。另外,由 Index 通过 Token 进行用户认证。有多种不同的 Registry,下面是其中几个的例子:

  1. Sponsor Registry 第三方 Registry,为客户和 Docker 社区提供服务。
  2. Mirror Registry 第三方 Registry,只为客户提供服务。
  3. Vendor Registry 由发布 Docker 镜像的供应商提供的 Registry。
  4. Private Registry 通过多重安全检查进行认证的私有 Registry。

Registry Client

用于进行 pull 和 push 的操作,同时用于 docker push 时的登录认证。

为了更好地理解 Registry Client 的工作流程,下面将详细描述一下五个案例中的 Docker Registry 工作流程。

情景 A:从官方仓库 Pull 镜像

  1. 用户对 Index 发出下载请求
  2. Index 返回以下三个部分的信息:

    • 镜像所在的 Registry。
    • 镜像所有的层的校验
    • 认证之后的 Token
  3. 用户使用 Token 和 Registry 进行通信,Registry 负责存储镜像和叠加在镜像上面的改动层。
  4. Registry 确认是否是 Index 所发出的的 Token。
  5. Index 返回确认值,由此判断用户是否可以下载镜像。
    >只有在请求的 header 里有 X-Docker-Token 时才会返回 Token。私有仓库需要认证,而公有仓库不需要认证。

clipboard.png

情景 B:Push 镜像到 Registry

  1. 用户向 Index 发送凭证,并要求分配 repository 名称。
  2. 认证 namespace 的可用性后,分配 repository 名称,同时 Index 返回一个临时 Token。
  3. 向 Registry 发送 Token 和镜像。
  4. Registry 向 Index 确认 Token,确认完毕之后读取推送流。
  5. Index 更新相关的镜像信息。

clipboard.png

情景 C:从 Index 和 Registry 删除一个镜像

  1. Index 收到 delete 某个 repository 的请求。
  2. 进行 repository 认证和用户认证,成功后 Index 给客户端返回一个临时 Token。
  3. Registry 收到删除信号和 Token。
  4. Registry 向 Index 验证 Token,然后删除对应的镜像文件。
  5. Registry 通知 Index 已经删除,Index 删除数据库中的所有相关的 repository 记录。

clipboard.png

情景 D:在没有 Index 的情况下使用 Registry

没有 Index 的 Registry 是完全受 Docker Clinet 控制的。这种模式最适合在私有网络中存储镜像文件。Registry 运行在一个和 Index 没有通信的环境中,所有的认证问题和安全问题都需要用户自己解决。

情景 E:在有 Index 的独立模式中使用 Registry

在这种情况下,用户需要自己架设一个 Index 去解决存储和认证问题。当然,这种情况下可能会出现和官方 Index 时间不同步的问题。Docker 官方也提供了一个非常有意思的东西叫做 chaining registries,主要是为了解决负载均衡和为具体请求指定具体的 Registry。
当然,我们可以参考 自己搭建本地 Docker Hub 服务 来搭建本地的 Docker Hub。。

接下来的文章中将会继续介绍如何在以上每个场景中使用 Docker Registry API,并且也会深入了解 Docker 安全。

阅读 5.5k

推荐阅读
大舒的博客
用户专栏

我都不写PHP了你们还挤兑我。。

139 人关注
36 篇文章
专栏主页