阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

从Docker Hub和docker-registry看优秀的后端服务设计实现

133次阅读
没有评论

共计 3064 个字符,预计需要花费 8 分钟才能阅读完成。

【编者的话】本文通过研究 Docker Hub 和 docker-registry 的架构,介绍了在服务端 Docker 镜像的存储、管理、安全的架构设计,并给出了一次简单的 Docker 客户端服务端交互的过程。对于部署实现一个大规模、企业级的镜像库需要做的工作做了初步的探讨,汇总了需要准备的前期知识等。推荐想要搭建一个私有 Docker 镜像库的同学阅读。

需求

最近因为工作需要,我开始研究 docker-registry 的实现和服务搭建。docker-registry 是 Docker 的镜像存储服务端。或者这么说,Docker 干的事情就是把整个应用、操作系统、配置打包成一个静态的镜像,这个镜像可以快速的启动和停止。但这种能力对单个人是没有多大意义的,我们需要有个地方把镜像存下来,然后用一个 url 分享给其他人。

如果是你,你会怎么设计?开一个公共的 FTP 让大家存镜像然后分享?这是个好主意,不过……Docker 的镜像有这么一个设定,就是一个镜像是由多层组成的,如果每次传输全量文件,对客户端、服务端、用户启动都造成时间和流量的浪费。

从 Docker Hub 和 docker-registry 看优秀的后端服务设计实现

于是……

需求一:远程存储服务

上传和下载需要智能的识别对面有没有这层,如果两边的层的 uuid 一致,已经有的话,就不传了。

简单的根据名字上传下载,对日常使用来说还不够方便,我们还需要一个 Web 界面,以支持登录、搜索、区分公共的镜像和私有的镜像等需求,这是用户的需求,不是客户端程序的需求。

从 Docker Hub 和 docker-registry 看优秀的后端服务设计实现

需求二:Web 界面,支持搜索

每个镜像层一般都有几十兆到几百兆的大小,可以想象,当很多用户都往一个地方上传时,单个服务器的存储容量是绝对支撑不住的,需要可以水平扩展的集群,但 Web 界面不能分开,客户端程序也不应该很麻烦的自己找去哪里下载。

从 Docker Hub 和 docker-registry 看优秀的后端服务设计实现

需求三:支持水平扩展的集群存储

Docker Hub 和 docker-registry 的分工如下:

Docker Hub 负责管理集中的信息访问,包括:

  • 用户账户
  • 镜像的效验码
  • 公共和私人镜像仓库的区分

Docker Hub 有几个组件:

  • Web UI
  • Meta-data 元数据存储(附注、星级、公共库清单)
  • 访问认证
  • token 管理

dokcer-registry 有如下几个特性:

  • 存储镜像、以及镜像层的家族谱系
  • 没有用户账户数据
  • 不知道用户的账户和安全性
  • 把安全和认证委托给 docker-hub 来做,用 token 来保证传递安全
  • 不需要重新发明轮子,支持多种存储后端
  • 没有本地数据库

一次 docker pull 或 push 背后发生的事情

142853_vFJA_224285.png

从 Docker Hub 和 docker-registry 看优秀的后端服务设计实现
这两个图里面的 index 就是 hub,可以看到每次客户端都要先访问 index,决定镜像文件从哪个 registry 上传或下载,然后去相应的 registry 操作。从阅读源码中可以看出,在 registry 上,每个镜像的层都是以 tar.gz 格式存储的。

自己搭建 Docker 镜像服务的考虑

既然是私服,同样需要考虑用户、安全认证、搜索等问题,可以说,Docker 的开发者在设计镜像服务时就考虑了这些问题,把 Web 这块留给每个私服的开发者自己去实现,并把后端存储抽象成接口来调用。docker-registry 的源代码放在这里。为了保证后续的正常开发使用,我决定先阅读一下这个源码,不过碰上了不少问题,具体如下:

  • docker-registry 是用 Python 实现的,我对 python 的了解仅仅限于简单的脚本,对 Python 的包、模块、类都不大懂,所以我学习了 Python。
  • docker-registry 使用了 egg 打包发布,Gunicorn 作为应用服务器(类似 Tomcat),Flask 作为 MVC 框架(类似 Spring),后面还有 SQLAlchemy 作为搜索后端。这些技术都需要做简单的了解,在需要的时候深入学习。
  • 后端存储,因为镜像最终是以 tar.gz 的方式静态存储在服务端,不需要实时读或者写,所以适用于对象存储而不是块存储,于是问题就转化成找一个或写一个私有的存储驱动,官方支持的驱动有亚马逊 AWS S3、Ceph-s3、Google gcs、OpenStack swift、Glance 等等,国内的七牛也写了自己的驱动。
  • 搜索,这块我还没涉及,后续再看……
  • Web UI 的实现,现在 GitHub 上已经有好几个项目了,例如 docker-registry-web、docker-registry-frontend,后续再看……

最近在研究用 Docker 实现 PaaS,欢迎大家有想法找我交流:-)

最后分析一下这个架构的优点

  • 解耦合
    Docker Hub 是 web-UI、用户认证、镜像元数据的集合,在这个方面,不同的组织有不同的做法,所以需要独立出来。docker-registry 是所有组织可以复用的部分,单纯用于镜像存储服务。
  • 不重复造轮子
    docker-registry 自己去实现一套对象存储了吗?没有,因为在对象存储这个领域,已经有很多优秀的实现。所以 docker-registry 是一个 HTTP 接口的服务,仅仅是在对象存储上包了一层镜像的家族谱系,而且底层支持多种对象存储。
  • 水平扩展性
    在简单使用场景下,docker-registry 也支持本地文件系统存储,可以说是 all-in-one 的设计,开箱即用。而当把这个场景扩展,用于大规模企业级的应用时,Docker Hub 和 docker-registry 是 1:n 的关系,registry 本身是一个无状态的服务,可以非常容易的水平扩展。这也是设计者的狡猾之处,他把有状态的部分都抽离了,把存储这个最大的状态机制做成可以放在其他的对象存储上,这样在大规模使用场景下就不会有性能的问题,也不会有单点问题。任何一个 registry 挂掉都是可以忍受的,可以被轻易的恢复而没有副作用。

————————————– 分割线 ————————————–

CentOS 6/ 7 系列安装 Docker http://www.linuxidc.com/Linux/2014-07/104768.htm

Docker 的搭建 Gitlab CI 全过程详解 http://www.linuxidc.com/Linux/2013-12/93537.htm

Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm

在 Docker 中使用 MySQL http://www.linuxidc.com/Linux/2014-01/95354.htm

在 Ubuntu Trusty 14.04 (LTS) (64-bit)安装 Docker http://www.linuxidc.com/Linux/2014-10/108184.htm

Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm

Ubuntu 14.04 安装 Docker  http://www.linuxidc.com/linux/2014-08/105656.htm

阿里云 CentOS 6.5 模板上安装 Docker http://www.linuxidc.com/Linux/2014-11/109107.htm

————————————– 分割线 ————————————–

Docker 的详细介绍:请点这里
Docker 的下载地址:请点这里

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计3064字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中