转载

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

本系列教程翻译自 Flux7 Docker Tutorial Series,系列共有九篇,本文译自第四篇 Docker Tutorial Series, Part 4: Registry & Workflows 。

该系列所有文章将参考其他学习资料翻译,也会加入自己的学习作为部分注解。如有错误,欢迎指正。

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

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

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

Docker Registry 由三个部分组成:index、registry、registry client。

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

原文讲的是 Docker Hub 的架构,没有太多实践性的东西; 被题目骗了 、想看如何推送镜像的同学可以直接翻到最后看例子。

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 时的登录认证。

Docker Registry 工作流程

一共来讨论以下五种情境模式以便更好地理解 Registry Client 的工作流程。

情景 A:从官方仓库 pull 一个镜像

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

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

情景 B:用户给 registry push 一个镜像

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

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

情景 C:用户希望从 Index 和 registry 删除一个镜像

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

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

情景 D:用户希望在没有 Index 的情况下使用 registry

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

情景 E:用户希望在有 Index 的独立模式中使用 registry

在这种情况下,私有网络中有一个 Index 会去解决存储和认证问题。但是可能和官方 Index 会出现时间差的问题。Docker 官方也提供了一个非常有意思的东西叫做 chaining registries ,主要是为了解决负载均衡和为具体请求指定具体的 registry。接下来的文章中将会继续介绍如何在以上每个场景中使用 Docker Registry API,并且也会深入了解 Docker 安全。

一个例子

在第二篇文章中,我们创建了一个名叫 job1 的容器(镜像),我们现在要把它推送到 Docker Hub 上面。

注册账号

  1. 在 这里 注册账号,验证邮箱
  2. 比 GitHub 要简单一点,无需在 Docker Hub 上面新建一个 repository
  3. job1 做一个标签(重命名): docker tag job1 qiuker521/myresp
  4. job1 已经可以删除了: docker rmi job1
  5. 查看现有的 images

    命令 # docker images REPOSITORY               TAG                 IMAGE ID            CREATED              VIRTUAL SIZE qiuker521/myresp         latest              9b748dc45fd1        29 hours ago        2.433 MB ubuntu                   latest              b7cf8f0d9e82        2 days ago          188.3 MB hello-world              latest              91c95931e552        6 days ago          910 B busybox                  latest              8c2e06607696        6 days ago          2.433 MB crosbymichael/dockerui   latest              109c8f1f632d        13 months ago       398.7 MB 
  6. 推送这个镜像: docker push qiuker521/myresp

    命令 # docker push qiuker521/myresp The push refers to a repository [qiuker521/myresp] (len: 1) 9b748dc45fd1: Image push failed  Please login prior to push: Username: qiuker521 Password: Email: qiuker521#163.com WARNING: login credentials saved in /root/.dockercfg. Login Succeeded The push refers to a repository [qiuker521/myresp] (len: 1) 9b748dc45fd1: Image already exists 8c2e06607696: Image successfully pushed 6ce2e90b0bc7: Image successfully pushed cf2616975b4a: Image successfully pushed Digest: sha256:f9e11f5420a30655b7e088d3f08e0b95e089e401911758a3b311bfa9c419ec2d 
  7. 推送完毕

注意事项

  1. 本地的镜像名称必须是 username/repository 格式才可以进行推送。
  2. Docker Hub 毕竟是国外的服务,所以网络可能会出问题。

可以参考这篇文章 自己搭建本地 Docker Hub 服务 。

正文到此结束
Loading...