Docker进阶与实战.html.pdf

上传人:紫*** 文档编号:2916040 上传时间:2020-05-22 格式:PDF 页数:36 大小:1.09MB
返回 下载 相关 举报
Docker进阶与实战.html.pdf_第1页
第1页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《Docker进阶与实战.html.pdf》由会员分享,可在线阅读,更多相关《Docker进阶与实战.html.pdf(36页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、序 我们这个团队的主业是操作系统内核开发。“太阳底下没有新鲜事”,这句话对于操作系统来说,有着深刻的意义。一个爆红的技术,寻根溯源,你会发现它往往已经在操作系统里潜伏很久。这种例 子俯拾皆是。 虚拟化技术的源头可以追溯到20世纪70年代初期IBM的S370,但直到2003年的SOSP会议上一篇关于虚拟化的论文Xen and the Art of Virtualization引起广泛关注之后,虚拟化才走上发展的快 车道。在软件领域,虚拟化技术把VMware打造成400亿美元量级的行业明星,又在硬件领域搅动了CPU、网络、存储等各个市场,迫使市场上的行业领袖做出相应的创新。现在,计算虚拟化、网络虚

2、拟 化、存储虚拟化这些概念已经深入人心。 而容器技术也不是全新的概念,系统容器最早可以追溯到20世纪80年代初期的chroot;打着轻量级虚拟化旗号的商用软件也是在21世纪之初由Virtuozzo提出的。但当时这个技术只是在系统管理员的 小圈子里口耳相传,不愠不火地发展着。直到2013年,有一家叫作dotCloud的小公司开源了一个叫Docker的小项目 若将Docker的核心技术层层剥离开来分析,作为操作系统开发人员,我们是无法理解Docker为什么会爆发成为行业里的新星的。因为严格来说,Docker用的所有关键技术都早已存在: Cgroup(Control Group)是Google在20

3、06年启动开发的,算起来也有将近10年的历史了。 对于Namespace,从最早的Mount namespace算起,不断迭代到今天,已成为包括UTS(系统标识)、IPC(进程间通信)、PID(进程标识)、Network(网络设备、IP地址以及路由表)、User(用户 标识)等的技术,可谓洋洋大观。 Aufs的历史可以追溯到1993年的Inheriting File System,虽然Aufs没有进入Linux主线,但也已经在Debian、Gentoo这样的主流发行版中得到应用。 这些“大叔辈”的技术,通过Docker引擎的组合,焕发出“小鲜肉”的吸引力。而从另一个方面看,那些在技术和理念上更

4、先进的项目,比如OSv,反而远没有得到这种众星捧月般的待遇。 为什么会这样?这个疑问促使我们摘下操作系统开发人员的帽子,带上系统运维人员的帽子,带上应用开发者的帽子,换个角度审视自己从前的工作。 在这个角色转换的过程中,我们得到了很多的收获: 首先,我们代表国内的技术人为Docker社区做出了一些贡献,此为收获一。 因为换了一个角度,对这个技术兴起背后的原因有了更深刻的理解,此为收获二。 利用工作之余,将技术经验转化为文字,把容器技术传播给更广泛的受众,此为收获三。 如果读者在阅读本书和实践后,不仅知其然,而且知其所以然,并与我们一同把容器技术的发展推向下一个阶段,那可以算是最大的收获了。 是

5、以为序! 华为2012实验室操作系统专家 胡欣蔚 2015年11月 前言 为什么要写这本书 在计算机技术日新月异的今天,Docker也算是其中异常璀璨的一员了。它的生态圈涉及内核、操作系统、虚拟化、云计算、DevOps等热门领域,受众群体也在不断扩大。 Docker在国内的发展如火如荼,短短一两年时间里就陆续出现了一批关于Docker的创业公司。华为公司作为国内开源领域的领导者,对Docker也有很大的投入,我们认为有必要把自己的知识积累和 实践经验总结出来分享给广大开发者。除了吸引更多的人投入到Docker的生态建设以外,我们也希望通过本书帮助更多的读者更好、更快地掌握Docker关键技术。

6、 关于本书 目前市场已经有一些不错的Docker入门图书,但多侧重于入门和具体的应用,本书会介绍一些Docker关键技术原理和高级使用技巧,适合有一定基础的读者。另外,本书会对Docker涉及的各个模 块、关系和原理进行系统梳理,帮助读者对Docker加深认识,更好地应用Docker部署生产环境,最大程度安全有效地发挥Docker的价值。 本书不仅适合一般的Docker用户,也适合Docker生态圈中的开发者,希望它可以成为一本Docker进阶的图书,帮助读者快速提升。 本书是由华为整个Docker团队合作完成的,笔者包括(排名不分先后):邓广兴、胡科平、胡欣蔚、黄强、雷继棠、李泽帆、凌发科、

7、刘华、孙远、谢可杨、杨书奎、张伟、张文涛、邹钰。 本书的内容 本书的定位是有一定Docker基础的读者,所以在基本的概念和使用上,我们不会花过多的篇幅讲解,而是给出相应有价值的链接,作为读者的延伸阅读。 在内容上,除了对Docker进行系统的梳理外,同时还会对Docker背后的核心技术(即容器技术)及其历史进行介绍,进一步帮助读者更好地理解Docker。 章节划分则以功能模块为粒度,对每一个重要的模块进行了深入分析和讲解,同时也为热门领域单独开辟了章节。在每一章的最后都会讲解一些高级用法、使用技巧或实际应用中遇到的问题。虽然各 章节的内容相对独立,但也会有一些穿插的介绍和补充,以帮助读者融会贯

8、通,系统深入地理解Docker的每一个细节。 另外,本书的笔者都是一线的开发者和Docker社区活跃的贡献者,因此书中还专门准备了一个章节来介绍参与Docker开发的流程和经验。同时,伴随Docker的发展,Docker生态圈也在不断扩大并吸 引了越来越多的人的关注。Docker集群管理和生态圈的介绍也将作为本书重点章节详细讲解。此外,Docker测试也是比较有特色的内容,分享了笔者在测试方面的经验。最后,附录中所包含的常用的 Docker相关信息,可供读者需要时查询。 本书的内容和代码都是基于Docker 1.8版本的。在代码示例中,使用“#”开头的命令表示以root用户执行,以“$”开头的

9、命令表示以普通用户执行。 勘误和支持 由于笔者水平有限,编写的时间也很仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。读者可以把书中发现的问题或建议发送到邮箱docker,我们会尽快回复大 家的疑问,并把收集的信息整理修正。 致谢 本书是由整个Docker团队协作完成的,由于繁忙的工作书稿撰写几度中止。感谢我们的项目经理裴斐月女士,正是她的整体协调和督促,以及与出版社的大量沟通,才促成了本书的出版。感谢李泽 帆,他不仅参与了本书的写作,而且承担了全书的审读工作,给出了大量有价值的建议。还要感谢Stephen Li、陈佳波、杨开封、胡欣蔚和张殿芳,以及其他华为公司主管对我们写书的

10、大力支持,感谢机 械工业出版社的编辑耐心专业的指导和审核。最后,感谢我们每一位家人的支持陪伴,我们的工作因为有了家人的支持和期待才变得更有意义。 华为Docker实践小组 2015年11月 第1章 Docker简介 1.1 引言 1.1.1 Docker的历史和发展 自从2013年年初一个叫dotCloud的PaaS服务供应商将一个内部项目Docker开源之后,这个名字在短短几年内就迅速成为一个热词。似乎一夜之间,人人都开始谈论Docker,以至于这家公司干脆出 售了其所持有的PaaS平台业务,并且改名为Docker.Inc,从而专注于Docker的开发和推广。 对于Docker,目前的定义是

11、一个开源的容器引擎,可以方便地对容器(关于容器,将在第2章详细介绍)进行管理。其对镜像的打包封装,以及引入的Docker Registry对镜像的统一管理,构建了方便 快捷的“Build,Ship and Run”流程,它可以统一整个开发、测试和部署的环境和流程,极大地减少运维成本。另外,得益于容器技术带来的轻量级虚拟化,以及Docker在分层镜像应用上的创 新,Docker在磁盘占用、性能和效率方面相较于传统的虚拟化都有非常明显的提高,所以理所当然,Docker开始不断蚕食传统虚拟化的市场。 随着Docker技术的迅速普及,Docker公司持续进行融资,并且其估值也在不断攀升,同时,Dock

12、er公司也在不断地完善Docker生态圈,这一切使得Docker正慢慢成为轻量级虚拟化的代名词。在可 预见的未来,很可能需要不断地刷新对Docker的定义。 目前Docker已加入Linux基金会,遵循Apache 2.0协议,其代码托管于Github( 第1章 Docker简介 1.1 引言 1.1.1 Docker的历史和发展 自从2013年年初一个叫dotCloud的PaaS服务供应商将一个内部项目Docker开源之后,这个名字在短短几年内就迅速成为一个热词。似乎一夜之间,人人都开始谈论Docker,以至于这家公司干脆出 售了其所持有的PaaS平台业务,并且改名为Docker.Inc,从

13、而专注于Docker的开发和推广。 对于Docker,目前的定义是一个开源的容器引擎,可以方便地对容器(关于容器,将在第2章详细介绍)进行管理。其对镜像的打包封装,以及引入的Docker Registry对镜像的统一管理,构建了方便 快捷的“Build,Ship and Run”流程,它可以统一整个开发、测试和部署的环境和流程,极大地减少运维成本。另外,得益于容器技术带来的轻量级虚拟化,以及Docker在分层镜像应用上的创 新,Docker在磁盘占用、性能和效率方面相较于传统的虚拟化都有非常明显的提高,所以理所当然,Docker开始不断蚕食传统虚拟化的市场。 随着Docker技术的迅速普及,D

14、ocker公司持续进行融资,并且其估值也在不断攀升,同时,Docker公司也在不断地完善Docker生态圈,这一切使得Docker正慢慢成为轻量级虚拟化的代名词。在可 预见的未来,很可能需要不断地刷新对Docker的定义。 目前Docker已加入Linux基金会,遵循Apache 2.0协议,其代码托管于Github( 1.2 功能和组件 Docker为了实现其所描述的酷炫功能,引入了以下核心概念: Docker客户端 Docker daemon Docker容器 Docker镜像 Registry 下面就分别来简单地介绍一下。 1.3 安装和使用 1.3.1 Docker的安装 Docker

15、的安装和使用有一些前提条件,主要体现在体系架构和内核的支持上。对于体系架构,除了Docker一开始就支持的x86-64,其他体系架构的支持则一直在不断地完善和推进中,用户在安装前 需要到Docker官方网站查看最新的支持情况。对于内核,目前官方的建议是3.10以上的版本,除了内核版本以外,Docker对于内核支持的功能,即内核的配置选项也有一定的要求(比如必须开启Cgroup 和Namespace相关选项,以及其他的网络和存储驱动等)。如果你使用的是主流的发行版,那通常它们都已经打开了,如果使用的是定制化的内核,Docker源码中提供了一个检测脚本(目前的路径 是./contrib/check

16、-config.sh)来检测和指导内核的配置。 在满足前提条件后,安装就非常的简单了,对于多数主流的发行版,通常只需要一条简单的命令即可完成安装,比如在Ubuntu下,可以使用如下命令安装: $ sudo apt-get install docker.io 当然,实际情况可能会相对复杂些,比如,虽然Ubuntu中通常自带了Docker,但用户常常需要使用最新版本的Docker,以至于不得不对其进行升级。对于安装和升级,以及不同发行版上的操作方 法,官方网站上提供了更加详细的说明,本书不做过多的赘述,下面的链接给出了常用发行版的安装方法: Ubuntu( Fedora( Debian( Cent

17、os( Gentoo( Arch Linux( Windows( Mac OS X( 另外,用户也可以直接获取Docker binary来运行, 的Docker,除了有可执行文件之外,还包括了Shell自动完成脚本、man手册、服务运行和配置脚本等内容,可以帮助用户更好地配置和使用Docker。 提示 Docker还有一些其他更方便的安装方式,这将在后面的章节中详细介绍。 1.4 概念澄清 本书的附录A是关于Docker常见问题的解答,但对于Docker基本概念方面的问题,希望读者可以在阅读完本章后就有清晰的认识,所以本节会针对与Docker概念息息相关的几个常见问题进行说明。 1.5 本章小

18、结 本章对Docker的基本概念、组成和使用方法做了介绍,使读者对Docker有一个整体的认识,后续的章节会对本章提到的内容展开更详细的讲解,让读者对Docker有全面且细致的理解。 第2章 关于容器技术 在第1章对Docker的介绍中,已经知道容器技术是Docker的一项基础技术,而在当前对Docker的火热讨论中,容器也时常跟Docker一起被提及。作为Docker的进阶书籍,有必要对容器技术做一些探 讨,以深刻理解Docker与相关技术之间的关联。 2.1 容器技术的前世今生 2.1.1 关于容器技术 容器技术,又称为容器虚拟化,从字面上看它首先是一种虚拟化技术。在如今的技术浪潮下,虚拟

19、化技术层出不穷,包括硬件虚拟化、半虚拟化、操作系统虚拟化等。本书不会对虚拟化技术展开介 绍,只需要知道容器虚拟化是一种操作系统虚拟化,是属于轻量级的虚拟化技术即可。又因为在实现原理上,每一种虚拟化技术之间都有较大的差别,所以即使没有虚拟化的技术背景,也是可以单独来学 习容器虚拟化的。 容器技术之所以受欢迎,一个重要的原因是它已经集成到了Linux内核中,已经被当作Linux内核原生提供的特性。当然在其他平台上也有相应的容器技术,但本书讨论的以及Docker涉及的都是指 Linux平台的容器技术。 对于容器,目前并没有一个严格的定义,但普遍认可的说法是,它首先必须是一个相对独立的运行环境,在这一

20、点上,有点类似虚拟机的概念,但又没有虚拟机那样彻底。另外,在一个容器环境内, 应该最小化其对外界的影响,比如不能在容器中把host上的资源全部消耗掉,这就是资源控制。 一般来说,容器技术主要包括Namespace和Cgroup这两个内核特性。 Namespace又称为命名空间(也可翻译为名字空间),它主要做访问隔离。其原理是针对一类资源进行抽象,并将其封装在一起提供给一个容器使用,对于这类资源,因为每个容器都有自己的抽象, 而它们彼此之间是不可见的,所以就可以做到访问隔离。 Cgroup是control group的简称,又称为控制组,它主要是做资源控制。其原理是将一组进程放在一个控制组里,通

21、过给这个控制组分配指定的可用资源,达到控制这一组进程可用资源的目的。 实际上,Namespace和Cgroup并不是强相关的两种技术,用户可以根据需要单独使用它们,比如单独使用Cgroup做资源控制,就是一种比较常见的做法。而如果把它们应用到一起,在一个 Namespace中的进程恰好又在一个Cgroup中,那么这些进程就既有访问隔离,又有资源控制,符合容器的特性,这样就创建了一个容器。 对于Namespace和Cgroup,后面的章节会做详细的介绍。 2.2 一分钟理解容器 2.2.1 容器的组成 上文已多次提及,容器的核心技术是Cgroup+Namespace,但光有这两个抽象的技术概念是

22、无法组成一个完整的容器的。在2.1.2节也提到过最早的容器概念就包括了对文件目录视图的抽象隔离,而 所有的这一切,都需要有工具来驱动,需要有一个工具来提供用户可操作的接口,来创建一个容器。所以笔者认为,对于Linux容器的最小组成,可以由以下公式来表示: 容器=cgroup+namespace+rootfs+容器引擎(用户态工具) 其中各项的功能分别为: Cgroup:资源控制。 Namespace:访问隔离。 rootfs:文件系统隔离。 容器引擎:生命周期控制。 目前市场上所有Linux容器项目都包含以上组件。 2.3 Cgroup介绍 2.3.1 Cgroup是什么 Cgroup是con

23、trol group的简写,属于Linux内核提供的一个特性,用于限制和隔离一组进程对系统资源的使用,也就是做资源QoS,这些资源主要包括CPU、内存、block I/O和网络带宽。Cgroup 从2.6.24开始进入内核主线,目前各大发行版都默认打开了Cgroup特性。 从实现的角度来看,Cgroup实现了一个通用的进程分组的框架,而不同资源的具体管理则是由各个Cgroup子系统实现的。截止到内核4.1版本,Cgroup中实现的子系统及其作用如下: devices:设备权限控制。 cpuset:分配指定的CPU和内存节点。 cpu:控制CPU占用率。 cpuacct:统计CPU使用情况。 m

24、emory:限制内存的使用上限。 freezer:冻结(暂停)Cgroup中的进程。 net_cls:配合tc(traffic controller)限制网络带宽。 net_prio:设置进程的网络流量优先级。 huge_tlb:限制HugeTLB的使用。 perf_event:允许Perf工具基于Cgroup分组做性能监测。 在Cgroup出现之前,只能对一个进程做一些资源控制,例如通过sched_setaffinity系统调用限定一个进程的CPU亲和性,或者用ulimit限制一个进程的打开文件上限、栈大小等。另外,使用ulimit可 以对少数资源基于用户做资源控制,例如限制一个用户能创建的

25、进程数。而Cgroup可以对进程进行任意的分组,如何分组是用户自定义的,例如安卓的应用分为前台应用和后台应用,前台应用是直接跟用 户交互的,需要响应速度快,因此前台应用对资源的申请需要得到更多的保证。为此安卓将前台应用和后台应用划分到不同的Cgroup中,并且对放置前台应用的Cgroup配置了较高的系统资源限额。 提示 从1.6版本开始,Docker也支持ulimit,读者可以查阅相关Docker文档及Linux用户手册。 2.4 Namespace介绍 2.4.1 Namespace是什么 Namespace是将内核的全局资源做封装,使得每个Namespace都有一份独立的资源,因此不同的进

26、程在各自的Namespace内对同一种资源的使用不会互相干扰。 这样的解释可能不清楚,举个例子,执行sethostname这个系统调用时,可以改变系统的主机名,这个主机名就是一个内核的全局资源。内核通过实现UTS Namespace,可以将不同的进程分隔在不 同的UTS Namespace中,在某个Namespace修改主机名时,另一个Namespace的主机名还是保持不变。 目前Linux内核总共实现了6种Namespace: IPC:隔离System V IPC和POSIX消息队列。 Network:隔离网络资源。 Mount:隔离文件系统挂载点。 PID:隔离进程ID。 UTS:隔离主机

27、名和域名。 User:隔离用户ID和组ID。 2.5 容器造就Docker 关于容器是否是Docker的核心技术,业界一直存在着争议。有人认为Docker的核心技术是对分层镜像的创新使用,有人认为其核心是统一了应用的打包分发和部署方式,为服务器级别的“应用商 店”提供了可能,而这将会是颠覆传统行业的举措。事实上,这一系列创新并不是依赖于容器技术的,基于传统的hypervisor也可以做到,业界也由此诞生了一些开源项目,比如Hyper、Clear Linux等。 另外,Docker官方对Docker核心功能的描述“Build,Ship and Run”中也确实没有体现与容器强相关的内容。 尽管如

28、此,笔者依然认为容器是Docker的核心技术之一。 首先从Docker的诞生历史上,它主要是为了完善当时不愠不火的容器项目LXC,使用户可以更方便地使用容器,让容器可以更好地应用到项目开发和部署的各个流程中。从一开始LXC就是Docker上的 唯一容器引擎也可以看出这一点。所以可以说,Docker是为容器而生的。 另外,更重要的一点,跟Docker一起发展和被大家熟知的,还有叫做“微服务”(micro service)的设计哲学,而这会把容器的优势发挥得更加淋漓尽致。容器作为Linux平台的轻量级虚拟化,其核 心优势是跟内核的无缝融合,其在运行效率上的优势和极小的系统开销,与需要将各个组件单独

29、部署的微服务应用完美融合。而且微服务在隔离性问题上更加可控,这也避免了容器相对传统虚拟化在隔离 性上的短板。所以,未来在微服务的设计哲学下,容器必将跟Docker一起得到更加广泛的应用和发展。 在理解了容器,理解了容器的核心技术Cgroup和Namespace,理解了容器技术如何巧妙且轻量地实现“容器”本身的资源控制和访问隔离之后,可以看到Docker和容器是一种完美的融合和相辅相成 的关系,它们不是唯一的搭配,但一定是最完美的组合。与其说是容器造就了Docker,不如说是它们造就了彼此,容器技术让Docker得到更多的应用和推广,Docker也使得容器技术被更多人熟知。在可 预见的未来,它们

30、也一定会彼此促进,共同发展,在全新的解决方案和生态系统中扮演着重要的角色。 2.6 本章小结 本章对容器技术做了详细的剖析,相信读者已经对容器的概念和原理有了清晰的认识,在这样的基础之上,可以更加轻松和深刻地理解Docker的一系列技术了,接下来的章节会针对Docker中的各个 子系统做详细的介绍。 第3章 理解Docker镜像 Docker所宣称的用户可以随心所欲地“Build、Ship and Run”应用的能力,其核心是由Docker image(Docker镜像)来支撑的。Docker通过把应用的运行时环境和应用打包在一起,解决了部署环 境依赖的问题;通过引入分层文件系统这种概念,解决

31、了空间利用的问题。它彻底消除了编译、打包与部署、运维之间的鸿沟,与现在互联网企业推崇的DevOps理念不谋而合,大大提高了应用开发部署 的效率。Docker公司的理念被越来越多的人理解和认可也就是理所当然的了,而理解Docker image则是深入理解Docker技术的一个关键点。 本章主要介绍Docker image的使用和相关技术细节。其中3.1节介绍Docker image的基本概念;3.2节从image生命周期的角度介绍其使用方法;3.3节介绍Docker image的组织结构;3.4节介绍 Docker image相关的一些扩展知识。 3.1 Docker image概念介绍 简单地

32、说,Docker image是用来启动容器的只读模板,是容器启动所需要的rootfs,类似于虚拟机所使用的镜像。首先需要通过一定的规则和方法表示Docker image,如图3-1所示。 图3-1是典型的Docker镜像的表示方法,可以看到其被“/”分为了三个部分,其中每部分都可以类比Github中的概念。下面按照从左到右的顺序介绍这几个部分以及相关的一些重要概念。 图3-1 Docker镜像的典型表示法 Remote docker hub:集中存储镜像的Web服务器地址。该部分的存在使得可以区分从不同镜像库中拉取的镜像。若Docker的镜像表示中缺少该部分,说明使用的是默认镜像库,即Dock

33、er官方镜像库。 Namespace:类似于Github中的命名空间,是一个用户或组织中所有镜像的集合。 Repository:类似于Git仓库,一个仓库可以有多个镜像,不同镜像通过tag来区分。 Tag:类似Git仓库中的tag,一般用来区分同一类镜像的不同版本。 Layer:镜像由一系列层组成,每层都用64位的十六进制数表示,非常类似于Git仓库中的commit。 Image ID:镜像最上层的layer ID就是该镜像的ID,Repo:tag提供了易于人类识别的名字,而ID便于脚本处理、操作镜像。 镜像库是Docker公司最先提出的概念1,非常类似应用市场的概念。用户可以发布自己的镜像,

34、也可以使用别人的镜像。Docker开源了镜像存储部分的源代码(Docker Registry以及 Distribution),但是这些开源组件并不适合独立地发挥功能,需要使用Nginx等代理工具添加基本的鉴权功能,才能搭建出私有镜像仓库。本地镜像则是已经下载到本地的镜像,可以使用docker images 等命令进行管理。这些镜像默认存储在/var/lib/docker路径下,该路径也可以使用docker daemong参数在启动Daemon时指定。 提示 Docker的镜像已经支持更多层级,比如用户的命名空间之前可以包含组织(Remote- 1 见。 3.2 使用Docker image D

35、ocker内嵌了一系列命令制作、管理、上传和下载镜像。可以调用REST API给Docker daemon发送相关命令,也可以使用client端提供的CLI命令完成操作。本书的第7章会详细阐述Docker REST API的细节,本节则主要根据功能对涉及image的命令进行说明。下面就从Docker image的生命周期角度说明Docker image的相关使用方法。 3.3 Docker image的组织结构 上节讲到Docker image是用来启动容器的只读模板,提供容器启动所需要的rootfs,那么Docker是怎么组织这些数据的呢? 3.4 Docker image扩展知识 Cgro

36、up和Namespace等容器相关技术已经存在很久,在VPS、PaaS等领域也有很广泛的应用,但是直到Docker的出现才真正把这些技术带入到大众的视野。同样,Docker的出现才让我们发现原来 可以这样管理镜像,可以这样糅合老技术以适应新的需求。Docker引入联合挂载技术(Union mount)使镜像分层成为可能;而Git式的管理方式,使基础镜像的重用成为可能。现在就了解一下相关的技 术吧。 3.5 本章小结 本章主要介绍了Docker image的使用方法,另外还介绍了Docker image在存储格式和数据上的组织方式,以及一些具体的实现细节。但是这种设计也存在着一些问题需要去克服:

37、 image难以加密。本质上Docker image是共享式的,如果我们加密了其中的layer,那么该层就无法被共享。值得注意的是,Docker提供了一套基于notary的镜像的签名机制,可以一定程度做到镜像的安 全分发。 image分层后产生了大量的元数据,不便于存储。现在很多分布式存储对小文件的支持都不是很好。所以搭建私有的镜像仓库时需要选用合理的存储后端。 image制作完成后无法修改。Docker未提供修改或合并层的命令,因此,如果制作镜像的过程中需要使用到一些隐私信息,则一定要在使用完后立即删除。 第4章 仓库进阶 4.1 什么是仓库 仓库(repository)用来集中存储Dock

38、er镜像,支持镜像分发和更新。目前世界上最大最知名的公共仓库是Docker官方发布的Docker Hub,上面有超过15000个镜像。国内比较知名的Docker仓库社 区有Docker Pool、阿里云等。 为满足容灾需求,Docker仓库后端通常采用分布式存储。比较常用的分布式存储平台包括亚马逊S3、微软Azure和华为UDS等。 第4章 仓库进阶 4.1 什么是仓库 仓库(repository)用来集中存储Docker镜像,支持镜像分发和更新。目前世界上最大最知名的公共仓库是Docker官方发布的Docker Hub,上面有超过15000个镜像。国内比较知名的Docker仓库社 区有Doc

39、ker Pool、阿里云等。 为满足容灾需求,Docker仓库后端通常采用分布式存储。比较常用的分布式存储平台包括亚马逊S3、微软Azure和华为UDS等。 4.2 再看Docker Hub 4.2.1 Docker Hub的优点 Docker Hub是目前世界上最大最知名的Docker镜像仓库,由Docker公司官方发布。Docker Hub的优点总结如下: 为开发者提供了海量Docker镜像,供免费下载学习和使用; 拥有完善的账户管理系统,为用户提供付费扩容; 服务器采用分布式部署,支持负载均衡; 支持镜像上传、下载、查询、删除及属性设置等多种操作; 支持在线编译镜像; 后端采用分布式存储

40、,可容灾备份; 其核心是Docker distribution,在开源社区上设计维护,会不断更新和完善; 提供企业版Docker Hub,为企业级用户提供一站式解决方案。 事实上Docker Hub属开源社区性质,为Docker开发者服务,在发布形式和服务功能上很大程度模仿了Github。Github托管代码,而Docker Hub托管镜像。这就使有过开源社区经验的开发者觉得 Docker Hub熟悉且方便。 4.3 仓库服务 Docker仓库和仓库注册服务经常被混为一谈。事实上服务是用来搭建仓库的,通常运行在容器里面。 Docker Registry是构建仓库的核心,用于实现开源Docker

41、镜像的分发。Docker Registry源码发布在: 这里只介绍2.0版本Registry。 4.4 部署私有仓库 4.4.1 运行私有服务 Docker私有服务(private registry)用来建设私有仓库,管理私有Docker镜像。部署私有服务的优点有: 可独立开发和运维私有仓库; 节省带宽资源; 有独立的账户管理系统; 增加了定制化功能。 搭建私有仓库的前提是部署Docker Private Registry。Registry的运行命令如下: $ docker run -d -hostname localhost -name registry-v2 -v /opt/data/di

42、stribution:/var/lib/registry/docker/registry/v2 -p 5000:5000 registry:2.0 基础镜像可以基于Docker Registry官方代码编译( 上面运行一个名为registry-v2的服务时,命令中的-v选项会把本地某个目录mount到容器内镜像存储目录,方便开发者查看和管理本地镜像数据。 这里为了演示,让Registry向外暴露了端口5000,这样一来,任何可以访问这台主机的用户都可以向Registry上传或下载镜像。比如,可用上面介绍Registry时演示的针对私有仓库的push/pull命令完 成操作: $ docker

43、push localhost:5000/official/ubuntu:14.04 push后面指明了服务主机名或域名localhost,5000代表对外端口,后面跟随的是具体仓库的名称。这样访问该主机的用户就都可以上传或下载镜像了。 4.5 Index及仓库高级功能 4.5.1 Index的作用和组成 按照上一节介绍的方法,搭建起来的私有仓库只具备镜像存储和安全访问功能,而不具备账户管理功能。要实现完整的解决方案,Docker开发者需要设计Docker Index用户管理系统。先来看看Index 和Registry的关系,如图4-13所示。 图4-13 Registry和Index交互过程1

44、 Index主要包括以下几项作用: 管理Docker Private Hub注册用户,认证用户访问权限; 保存记录和更新用户信息,以及token等校验信息; Docker元数据(metadata)存储; 记录用户操作镜像的历史数据; 提供操作界面Web UI,用户可以方便地访问和更新资源。 Index主要由几个子模块组成,包括控制单元、鉴权模块、数据库、健康检查模块和日志系统等。这里给出一个Index的参考设计,如图4-14所示。 图4-14 Index设计架构 1 该图源于: 4.6 本章小结 通过本章的介绍,读者了解了Docker Registry的作用和实现原理,以及一些重要的扩展功能。

45、 Docker Registry在演进过程中,功能和性能都在不断得到提升:镜像上传和下载的执行效率获得提高;Registry后端存储兼容了业界主流的分布式存储模式,使用者有了更多的选择;利用了Nginx和 Docker Compose技术可使多机部署更加容易;软件上实现了支持外部插件,使用者可以根据自己的需求开发插件,控制Registry行为。 未来,开发者会进一步丰富Docker Registry的功能,提升运行的稳定性,把Registry打造成为Docker核心服务之一。 第5章 Docker网络 5.1 Docker网络现状 随着Docker的迅速流行,越来越多的厂商开始探索Docker

46、在实际生产环境中的应用,其中又以云计算厂商为主流。迅速的流行也导致了Docker网络方面的短板早早地就暴露了出来性能低下、功 能不足,Docker网络成为了广受诟病的一大缺陷,在部署大规模Docker集群时,网络也成为了最大的挑战。 纯粹的Docker原生网络功能无法满足广大云计算厂商的需要,于是一大批第三方的SDN解决方案如雨后春笋般涌现出来,如Pipework、Weave、Flannel、SocketPlane等,这些优秀的开源软件弥补 了Docker网络方面的不足,Docker公司似乎也乐于见到并鼓励用户使用第三方的方案来满足形形色色的网络需求。 2015年3月,Docker宣布收购So

47、cketPlane,随后SocketPlane社区开始沉寂,一个新的Docker子项目“Libnetwork”开始酝酿。一个月后,Libnetwork1在github上正式与开发者见面,预示着 Docker开始在网络方面发力。 提示 git log显示,实际上早在2015年2月19日Libnetwork就提交了第一次commit,这也就意味着Libnetwork的生日实际上是2月19日。 Libnetwork提出了新的容器网络模型(Container Network Model,简称CNM),定义了标准的API用于为容器配置网络,其底层可以适配各种网络驱动(如图5-1所示)。CNM有三个重要的

48、概 念: 沙盒。沙盒是一个隔离的网络运行环境,保存了容器网络栈的配置,包括了对网络接口、路由表和DNS配置的管理。在Linux平台上,沙盒是用Linux Network Namespace实现的,在其他平台上可能是 不同的概念,如FreeBSD Jail。一个沙盒可以包括来自多个网络的多个Endpoint(端点)。 Endpoint。Endpoint将沙盒加入一个网络,Endpoint的实现可以是一对veth pair或者OVS内部端口,当前的Libnetwork使用的是veth pair。一个Endpoint只能隶属于一个沙盒及一个网络。通过给沙盒增加 多个Endpoint可以将一个沙盒加入

49、多个网络。 网络。网络包括一组能互相通信的Endpoint。网络的实现可以是Linux bridge、vlan等。 图5-1 CNM概念模型 从CNM的概念角度讲,Libnetwork的出现使得Docker具备了跨主机多子网的能力,同一个子网内的不同容器可以运行在不同主机上。比如,同属于192.168.0.0/24子网IP地址分别为192.168.0.1和 192.168.0.2的容器可以位于不同的主机上且可以直接通信,而持有IP 192.168.1.1的容器即使与IP为192.168.0.1的容器处于同一主机也不能互通。 到本书写成为止,Libnetwork已经实现了五种驱动(driver): bridge:Docker默认的容器网络驱动。Container通过一对veth pair连接到docker0网桥上,由Docker为容器动态分配IP及配置路由、防火墙规则等。 host:容器与主机共享同一Network Namespace,共享同一套网络协议栈、路由表及iptables规则等。容器与主机看到的是相同的网络视图。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com