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。

仓库是集中存放镜像的地方。官方提供的公共仓库是https://hub.docker.com。不用注册即可使用里面的众多仓库资源,包含了常用的ubuntu、centos、php、nginx、mysql等仓库。

由于国外仓库访问比较慢,可以使用国内的仓库,一般需要注册,使用docker pull的时候需要指明注册服务器地址。

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。私有仓库需要认证,而公有仓库不需要认证。

情景 B:Push 镜像到 Registry

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

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

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

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

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

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

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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐