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

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

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

需求

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

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

095141_PGk8_224285.jpg

于是……

需求一:远程存储服务

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

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

103423_tFFG_224285.png

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

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

113601_LIxf_224285.png

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

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

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

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

Docker Hub有几个组件:

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

dokcer-registry有如下几个特性:

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

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


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

142853_vFJA_224285.png

自己搭建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挂掉都是可以忍受的,可以被轻易的恢复而没有副作用。

原文发布时间:2015-01-21

本文来自云栖合作伙伴“linux中国”

时间: 2024-09-17 19:50:03

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

deploy owned private docker registry based on docker HUB registry image

docker HUB提供了registry的image, 可以非常方便的搭建私有regisrty. 当然你也可以选择从docker-registry的源码来搭建. 见 : https://github.com/docker/docker-registry 本文主要说一下使用docker registry image搭建私有registry. 1. 首先要部署docker 参考 :  https://docs.docker.com/installation/#installation 2. 启动d

Automated Builds on Docker Hub

page_title: Automated Builds on Docker Hub page_description: Docker Hub Automated Builds page_keywords: Docker, docker, registry, accounts, plans, Dockerfile, Docker Hub, docs, documentation, trusted, builds, trusted builds, automated builds Automate

Docker基础之十: 存储镜像到Docker Hub

存储镜像到Docker Hub (对Docker感兴趣的朋友可以加我的微信ghostcloud2016,然后我把你加到我们的一个Docker爱好者群组里面.) 到目前为止,我们已经学习了docker的基本用法,包括拉取镜像,运行容器,编译镜像文件等等.接下来,我们将学习如何通过docker hub来简化你的操作,并提高你的工作效率. Docker Hub是Docker的主仓库,由Docker公司进行维护.这个仓库里面包含了系统的官方镜像,同时提供简单的用户认证信息,以及其他的附属功能.默认情况下

docker search, pull, login, push with Docker Hub - public registry

docker HUB是一个公共的image registry, 不注册账号的话, 可以从docker hub下载public image. docker search, pull操作不需要登录docker hub就可以对public image进行检索和下载. 如果需要将本地的image 推送到docker hub, 那么你需要注册一个docker hub的账号, 登录, 然后执行push即可. docker hub的免费用户只能保存public image. 也就是说大家都能搜到并下载你的im

有人说Docker Hub上三成的镜像包含漏洞?扯吗不是?

本文讲的是有人说Docker Hub上三成的镜像包含漏洞?扯吗不是,[编者的话]到底Docker Hub上是否三成的镜像存在漏洞?通过漏洞计算发现确实有高比例漏洞,对于管方镜像遵循Docker的安全指南,如若是自创建镜像,可找源仓库或自行处理.但我们发现,这些漏洞中大部分是老镜像.面对漏洞镜像,我们可以采取本地措施,还可用Web安全审查进行检查,如果想让Docker更加安全,建议用dockerbench来评估.文中额外阐述了容器究竟有什么用. 这个数字太神奇了!并不是因为这个比例过高或者过低,而

有人说Docker Hub上三成的镜像包含漏洞?是吗?

到底Docker Hub上是否三成的镜像存在漏洞?通过漏洞计算发现确实有高比例漏洞对于官方镜像遵循Docker的安全指南如若是自创建镜像可找源仓库或自行处理.但我们发现这些漏洞中大部分是老镜像.面对漏洞镜像我们可以采取本地措施还可用Web安全审查进行检查如果想让Docker更加安全建议用dockerbench来评估.文中额外阐述了容器究竟有什么用. 这个数字太神奇了!并不是因为这个比例过高或者过低而是因为居然存在这个比例.既然存在(相对容易地)计算出这个比例的可能性也就意味着存在(相对容易地)改

Docker Hub 最受欢迎的10大镜像

Docker CEO Ben Golub在2014年的DockerCon上发布Docker Hub,并指出已经有超过14,000个Docker化的应用存储在他们的publc registry中.而根据2015年的DockerCon上,Docker SVP Marianna Tessel公布的数据,Docker Hub上的repos已经超过150,000个,仅一年就有了十倍的增长! 看到这些疯狂增长的数字,笔者不禁想去探索这些数据背后的故事.所以决定从Docker Hub中挖掘数据,通过调用Doc

Docker Hub中超过30%的官方镜像包含高危漏洞

本文讲的是Docker Hub中超过30%的官方镜像包含高危漏洞,[编者的话]Docker Hub是一个供Docker开发者用来上传/下载容器镜像的地方.为了认识其应对安全风险的能力如何,我们对其中的镜像进行了一次细致的研究.结果我们惊奇的发现,超过三成的官方仓库包含的镜像疑有高安全风险. Docker Hub是一个供Docker开发者用来上传/下载容器镜像的地方.为了认识其应对安全风险的能力如何,我们对其中的镜像进行了一次细致的研究.结果我们惊奇的发现,超过三成的官方仓库包含的镜像疑有高安全风

Docker Hub 中超过 30% 的官方镜像包含高危漏洞

[编者的话]Docker Hub是一个供Docker开发者用来上传/下载容器镜像的地方.为了认识其应对安全风险的能力如何,我们对其中的镜像进行了一次细致的研究.结果我们惊奇的发现,超过三成的官方仓库包含的镜像疑有高安全风险. Docker Hub是一个供Docker开发者用来上传/下载 容器镜像的地方.为了认识其应对安全风险的能力如何,我们对其中的镜像进行了一次细致的研究.结果我们惊奇的发现,超过三成的官方仓库包含的镜像疑有高安全风险(如:Shellshock.Heartbleed.Poodle