从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挂掉都是可以忍受的,可以被轻易的恢复而没有副作用。
【Docker】五 Docker Hub管理镜像 Docker Hub是Docker官方维护的Docker Registry,上面存放着很多优秀的镜像。不仅如此,Docker Hub还提供认证、工作组结构、工作流工具、构建触发器等工具来简化我们的工作。 前文已经讲过,我们可使用 `docker search` 命令搜索存放在Docker Hub中的镜像。这篇文章我们来详细探讨Docker Hub的使用。
Docker 进阶 发布自己的Docker镜像 将镜像上传到阿里云和Docker Hub 上传自己制作的docker镜像的方法,将docker镜像上传到Docker Hub,阿里云的两种方法,以及上传镜像时可能遇见的问题和解决办法,每一步的详解和上传镜像时的规范。
【云原生 | 07】官方镜像仓库Docker Hub和企业级私有镜像仓库Harbor Docker Hub是由Docker公司维护的一个注册中心。它拥有成千上万个镜像可供下载和运行。任何Docker用户都可以在上面创建免费账号及公共Docker镜像。除了用户提供的镜像,上面还维护着一些作为参考的官方镜像。...............
docker hub 简单使用 在 https://hub.docker.com 免费注册一个 Docker 账号。 $ docker login 退出 docker hub 可以使用以下命令: $ docker logout 你可以通过 docker search 命令来查找官方仓库中的镜像,并利用 docker pull 命令来将它下载到本地。
详解如何使用Docker Hub官方的MySQL镜像生成容器 一直在尝试以官方CentOS镜像为基础,制作基于CentOS的MySQL镜像。但是制作后发现镜像大小已经超过1.5G,这对于一般的Docker镜像来说太臃肿了。Docker Hub官方提供的CentOS镜像才324MB。目前来说我还没有找到什么好的方法把我制作的镜像的体积减下来,所以就先使用官方的吧!
相关文章
- 【Docker】搭建Docker私有 Registry 服务器之Harbor
- Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
- Docker - 创建支持SSH服务的容器镜像
- docker的常用操作之二:docker内无法解析dns之firewalld设置等
- 【云栖大会】Docker与阿里云达成战略合作 为企业级客户提供容器服务
- 【1】ubuntu 安装docker
- Docker docker部署以及运行你的第一个容器
- 为什么docker比VM快?
- 使用阿里云容器服务Jenkins实现持续集成和Docker镜像构建(updated on 2017.3.3)
- Docker 实战教程之从入门到提高 (六)
- SAP S/4HANA装到Docker里的镜像有多大
- 使用阿里云容器服务Jenkins实现持续集成和Docker镜像构建(updated on 2017.3.3)
- Docker 安装 Redis
- .NET 微服务实践(3)-部署服务到Docker与Kubernetes
- docker部署服务初体验
- 10.Docker的多阶段构建
- Docker学习笔记17:docker实例之安装 Node.js、PHP、MySQL、Tomcat、Python、Redis、MongoDB、Apache
- 云原生之使用Docker部署webssh工具sshwifty
- Docker笔记之与镜像相关的命令整理