文档章节

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

难易
 难易
发布于 2015/01/09 14:55
字数 1545
阅读 1881
收藏 63

##需求

最近因为工作需要,开始研究docker-registry的实现和服务搭建。docker-registry是啥呢?就是目前很火的容器docker的镜像存储服务端。

或者这么说把,docker干的事情就是把整个应用、操作系统、配置打包成一个静态的镜像,这个镜像可以快速的启动关闭为一个动态的运行容器。但这种能力对单个人是没有很大意义的,我们需要有个地方把镜像存下来,然后用一个url或者链接分享给其他人。

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

文件层

于是……

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


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

在此输入图片描述

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


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

在此输入图片描述

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


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格式存储的。

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

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

  • docker-registry是用python实现的,我对python的了解仅仅限于简单的脚本,对python的包、模块、类都不大懂,所以我学习了python

  • docker-registry使用了egg打包发布,gunicorn作为应用服务器(类似tomcat),flask作为mvc框架(类似spring),后面还有sqlalchemy作为搜索后端。这些技术都需要做简单的了解,在需要的时候深入学习。

  • 后端存储,因为镜像最终是以tar.gz的方式静态存储在服务端,不需要实时read或write,所以适用于对象存储而不是块存储,于是问题就转化成找一个或写一个私有的存储驱动,官方支持的驱动有亚马逊AWS S3、ceph-s3、Google gcs、OpenStack swift,glance等等,国内的七牛也写了自己的驱动 ,后面在我的环境需要自己写一个驱动。

  • 搜索,这块我还没涉及,后续再看……

  • Web UI的实现,现在github上已经有好几个项目了,例如docker-registry-webdocker-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挂掉都是可以忍受的,可以被轻易的恢复而没有副作用。

© 著作权归作者所有

共有 人打赏支持
难易

难易

粉丝 260
博文 44
码字总数 100878
作品 2
杭州
程序员
加载中

评论(4)

难易
难易

引用来自“班念威”的评论

研究它的代码有没有捷径,不想把所有的代码都看一遍,我觉得也没这个必要,请楼主传授方法

在docker的github源码里面,有docs目录,里面有很多文档,可以参考下。掌握代码的大致框架,需要相关知识再细读这一部分的代码即可。
患恐高症的小鸟
患恐高症的小鸟
研究它的代码有没有捷径,不想把所有的代码都看一遍,我觉得也没这个必要,请楼主传授方法
难易
难易

引用来自“alexon”的评论

额,不太懂,但感觉很厉害

哈哈说明我还没讲的通俗易懂,你不懂的地方是……?
alexon
alexon
额,不太懂,但感觉很厉害
【技术集锦】基于AWS ECS构建安全高可用的Docker私有云

  【IT168 方案】Docker Hub作为Docker官方镜像仓库,提供了大量Docker镜像的托管服务。但使用它来托管企业私有Docker镜像存在一些问题,比如:   Docker Hub托管私有镜像的服务目前只面...

it168网站
2017/07/31
0
0
Speedy:来自京东的 Docker 镜像存储系统

镜像是Docker项目最大的创新点之一,所有的Docker容器都源于镜像。不可否认镜像存储是Docker工作流中的重要一环,Docker Registry是官方提供的开源项目用以保存镜像,同时它也提供了后端存储...

夕水溪下
2015/09/12
2.7K
1
Docker 之 基于容器的镜像制作

1 概述 镜像包含启动容器所需的文件系统和内容,可以理解为打包的文件,用于创建并启动docker容器。 镜像的生成途径有三个: 1.基于dockerfile实现,镜像制作的程序文件 2.基于容器实现,启动...

ghbSunny
08/05
0
0
docker-registry的定制和性能分析

docker-index Web UI Meta-data 元数据存储(附注、星级、公共库清单) 访问认证 token管理 docker-registry 存储镜像、以及镜像层的家族谱系 没有用户账户数据 不知道用户的账户和安全性 把...

难易
2015/05/11
0
0
Docker Registry/Distribution概述

Registry vs Index Docker Registry服务中的两个重要组件,分别承担以下不同的职责: Index:主要负责集中管理用户账户,访问权限,镜像的校验和 以及区分公有和私有repos(也就是公共的命名空...

Markz0928
2017/03/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

qduoj~前端~二次开发~打包docker镜像并上传到阿里云容器镜像仓库

上一篇文章https://my.oschina.net/finchxu/blog/1930017记录了怎么在本地修改前端,现在我要把我的修改添加到部署到本地的前端的docker容器中,然后打包这个容器成为一个本地镜像,然后把这...

虚拟世界的懒猫
今天
1
0
UML中 的各种符号含义

Class Notation A class notation consists of three parts: Class Name The name of the class appears in the first partition. Class Attributes Attributes are shown in the second par......

hutaishi
今天
1
0
20180818 上课截图

小丑鱼00
今天
1
0
Springsecurity之SecurityContextHolderStrategy

注:下面分析的版本是spring-security-4.2.x,源码的github地址是: https://github.com/spring-projects/spring-security/tree/4.2.x 先上一张图: 图1 SecurityContextHolderStrategy的三个......

汉斯-冯-拉特
今天
1
0
LNMP架构(Nginx负载均衡、ssl原理、生成ssl密钥对、Nginx配置ssl)

Nginx负载均衡 网站的访问量越来越大,服务器的服务模式也得进行相应的升级,比如分离出数据库服务器、分离出图片作为单独服务,这些是简单的数据的负载均衡,将压力分散到不同的机器上。有时...

蛋黄_Yolks
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部