本书的写作目的不仅是在技术层面深入分析Docker背后的技术原理和设计思想,更在于从我们团队自2011年以来在云计算方面的积累出发,理清当前以Docker、Kubernetes为代表的“容器云”技术的发展脉络,以期对IT企业的开发运维人员、容器云服务提供商以及Docker技术爱好者在技术选型、技术路线规划上有所帮助。

2013年是Docker正式开源发布的年份,也是我们团队开始使用Docker的时间。当时Docker作为一个单机版轻量级虚拟化工具,并没有像当前这样活跃的生态圈。我们使用Docker处理Cloud Foundry这类复杂分布式系统的快速部署和迁移,结果我们体验到了惊喜,但也有遗憾。确实,那时候Docker 1.0尚未发布,作为最先吃螃蟹的人之一,我们除了能感受到Docker相比虚拟机在资源利用率和性能上的巨大优势以及在使用方式上的高效便捷之外,还不得不忍受当时的Docker与一个完整的数据中心运维系统之间的差距。比如网络,跨宿主机间的通信在很长一段时间都困扰着我们;比如容器内部不能单独配置内核参数,一旦应用对性能有特殊要求的时候,就无法单独进行优化定制;再比如维护,时常需要手动清理僵尸容器、镜像等。

在随后的一整年里,我们真真切切地感受到了Docker是如何从一个开发运维人员略有耳闻的工具成长为一个技术圈里家喻户晓的名词。基于Docker的公有云、私有云项目也如雨后春笋般涌现;各大知名技术社区都为Docker开辟专栏,甚至出现了专为讨论Docker而生的技术社区。基于Docker的中国本土化也开始萌芽,各类国内镜像托管和加速服务层出不穷。Docker官方也没有闲着,前不久,Docker的各类邮件列表中都出现了招聘中国区执行官的消息。Docker生态系统的建立已经是不争的事实,我们团队也从Docker的使用者,成为了Docker、Kubernetes、libcontainer等开源项目的特性维护者(maintainer)和代码贡献者(contributor)。

当前Docker已绝不仅仅是一项轻量级虚拟化技术,官方的Docker运维三件套、来自第三方的Kubernetes、OpenShift v3、Flynn、Deis等项目已经基于Docker这种容器技术构建出各种各样的容器云服务平台,关于Docker等容器技术的讨论重心也已经从“容器”转变为“容器云”。Docker对于IT行业的价值也从节省资源这一方面扩展到对整个软件开发运维生命周期的改造。

作为软件行业多年的实践者和教育者,我们一直试图探索这样一些问题:云计算除了当前被广为接受的基础设施云平台(IaaS)的形态,是否还有更加贴近开发人员和运维人员的形态?云计算如何以更好的形态服务于互联网+这样一个以软件连接人与人、人与企业、企业与企业的时代?正是Docker这类容器技术的出现,使得这样的探索成为了可能。

本书结构

本书共分两部分,沿着从容器到容器云的发展脉络,从“概念用法解析”到“核心原理分析”,然后到“高级实践技巧”,层层推进,全面介绍了Docker以及围绕Docker构建的各类容器云平台技术,深入分析了Kubernetes背后的技术原理和设计思想。

第一部分讲解了Docker容器的核心原理和实践技巧。其中第1章和第2章能够让读者在短时间内体验这场IT界的风暴,并且初步了解Docker的使用方法,为后续的源码解析做铺垫。第3章是本书第一部分的核心,这一章以Docker 1.10版本源码为基础,深入分析了容器的namespace和cgroups原理,紧接着我们以docker run命令为线索,一路贯穿Docker的容器创建、镜像组织、联合文件系统以及容器网络初始化的源码,深入透彻地向读者展示了从一条指令到最终Linux容器生成的整个过程中,Docker源码的设计原理和执行路线。第4章则介绍了当前时髦的“容器化思维”以及Docker相关的几类实践技巧,包括网络、监控、服务发现等。值得一提的是,在上述代码走读的过程中,本书几乎没有贴出任何一部分Docker源码或者函数,而是力图使用平实的语言和生动的图示来展示代码背后的执行逻辑和设计思想。Docker的源码字字珠玑,我们希望能够使用这样的解读方式使读者真正理解Docker和容器背后的设计方法和技术本质,而不是变成一本单纯的技术手册。

第二部分深入分析基于Docker的各类“容器云”平台的架构细节和背后的设计理念,这些容器云虽然在底层技术上都基于Docker这样的容器技术,但在背后的设计思想上却存在很大的差异。我们将看到一个因颠覆了原有IaaS、PaaS云计算生硬的分类方式而精彩纷呈的容器云世界。其中第5章介绍了一个最简单的容器云解决方案作为引子;第6章和第7章分析和比较了几类典型的容器云开源项目,包括了Docker官方的“三剑客”项目、Fleet以及更类似经典PaaS的Flynn和Deis;第8章是本书第二部分的重点,我们以Kubernetes 1.2版本源码为基础,从核心概念到架构梳理,再到深入到组件级别的Kubernetes源码解析,从多个维度详细讲解了Kubernetes容器云平台的各种技术细节,这在国内尚属首次。我们希望通过容器云平台的源码解读,能够带领读者从纷繁复杂的容器云项目中梳理出一个细致的脉络,让读者在选型和二次开发的过程中减少迷茫和试错成本。而作为Kubernetes项目的贡献者和特性维护者,我们希望有更多的技术人员能够从源码层面对Kubernetes有更深刻的理解和认识,并且同我们一起来推动这个优秀的开源项目在国内的进步和落地。在第二部分的结尾,我们试图回答之前的提问,即容器云应该以何种形态来更好地支撑当今时代。

第2版的改进

自本书第1版出版以来,容器生态圈已经发生了翻天覆地的变化。新的开源项目层出不穷,各个开源项目都在快速迭代演进。Docker已经从本书第1版里的1.6.2发展为当前的1.10。Kubernetes也从本书第1版里的0.16发展到了现在的1.2,并且在1.0.1版本时宣布其已经正式进入可投入生产环境(production ready)的状态。

第3章是本书第一部分的重点。Docker 1.10版相对于本书第1版中的1.6.2版,主要的更新包括如下几个方面。

 Docker在架构方面不断将自身解耦,逐步发展成容器运行时(runtime)、镜像构建(builder)、镜像分发(distribution)、网络(networking)、数据卷(volume)等独立的功能组件,提供daemon来管理,并通过Engine暴露一组标准的API来操作这些组件(详见本书3.2节)。

 将网络和数据卷提升为“一等公民”,提供了独立子命令进行操作,网络和数据卷具备独立的生命周期,不再依赖容器的生命周期(详见本书3.7节、3.8节)。

 网络实现方面,Docker将网络相关的实现解耦为独立的组件libnetwork,抽象出一个通用的容器网络模型(CNM),功能上也终于原生支持了跨主机通信(详见本书3.8节)。

 在扩展性方面,在1.7.0版本后就开始支持网络、volume和存储驱动(仍处于实验阶段)的插件化,开发者可以通过实现Docker提供的插件标准来定制自己的插件(详见本书3.6节、3.7节、3.8节)。

 在Docker安全方面,Docker支持了user namespace和seccomp来提高容器运行时的安全,在全新的镜像分发组件中引入可信赖的分发和基于内容存储的机制,从而提高镜像的安全性(详见本书3.5节、3.6节、3.9节)。

需要特别指出的一点是,随着容器如火如荼的发展,为了推动容器生态的健康发展,促进生态系统内各组织间的协同合作,容器的标准化也显得越来越重要。Linux基金会于2015年6月成立OCI(Open Container Initiative)组织,并针对容器格式和运行时制定了一个开放的工业化标准,即OCI标准。Docker公司率先贡献出满足OCI标准的容器运行时runC,HyperHQ公司也开源了自己的OCI容器运行时runV,相信业界会有越来越多的公司加入这个标准化浪潮中。Docker公司虽然没有在Docker 1.10版本中直接使用runC作为容器的运行时,但是已经将“修改Docker engine来直接调用runC的二进制文件为Docker提供容器引擎”写入到了1.10版本的roadmap中。本书在3.4.3节中对runC的构建和使用进行了介绍。

第8章是本书第二部分的重点。由于Kubernetes的代码始终处于积极更新之中,自本书第1版截稿以来,Kubernetes又相继发布了0.17、0.18、0.19、0.20、0.21、1.0、1.1与1.2等几个版本。主要的更新包括如下几个方面。

 大大丰富了支撑的应用运行场景。从全面重构的long-running service的replicaSet,到呼声渐高的支持batch job的Job、可类比为守护进程的DaemonSet、负责进行应用更新的Deployment、具备自动扩展能力的HPA(Horizontal Pod Autoscaler),乃至于有状态服务的petSet,都已经或者即将涵盖在Kubernetes的支撑场景中(详见本书8.2节)。

 加强各个组件的功能扩展或者性能调优。apiserver和controller manager为应对全新的resource和API有显著的扩展;scheduler也在丰富调度策略和多调度器协同调度上有积极的动作;kubelet在性能上也有长足的进步,使得目前单个节点上支持的pod从原来的30个增长到了110个,集群工作节点的规模也从100个跃升为1000个;多为人诟病的kube-proxy如今也鸟枪换炮,默认升级为iptables模式,在吞吐量上也更为乐观;在可以预期的未来,rescheduler将成为Kubernetes家庭中的新成员,使得重调度成为可能(详见本书8.3节)。

 兼容更多的容器后端模型、网络及存储方案。从Docker到rkt,Kubernetes展示了对容器后端开放姿态,同时它还准备以C/S模式实现对其他容器的支撑。在网络方面,Kubernetes引入了网络插件,其中最为瞩目的当属CNI;存储上的解决方案更是层出不穷,flocker、Cinder、CephFS不一而足,还增加了许多特殊用途的volume,如secret、configmap等(详见本书8.4节、8.5节)。

 增加了OpenID、Keystone等认证机制、Webhook等授权机制,以及更为丰富的多维资源管理机制admission controller(详见本书8.6节)。

 另外,作为Kubernetes社区的积极参与者,我们还专门增加了8.8节,讨论当前社区正在酝酿中的一些新特性,如Ubernetes、petSet、rescheduler。我们还讨论了Kubernetes性能优化,以及Kubernetes与OCI的关系等话题。

除了全面更新这两个重点章节之外,我们还在第1章中更新了Docker近期的“大事记”并重新整理了容器生态圈,加入了许多重要的容器云技术开源项目,以及OCI、CNCF等国际标准化组织;在第2章中,我们将Docker命令行工具的基础用法更新到了Docker 1.10版;在第4章中完善了对时下火热的“容器化思维”和“微服务”的讨论;在第6章中更新了对Docker“三剑客”——Compose、Swarm和Machine的讨论;在附录中以Docker 1.10版为标准更新了附录A的Docker安装指南,以Kubernetes 1.2为标准,更新了附录F中Kubernetes的安装指南。

致谢

对于能够编写国内第一本在源代码层面深度解析Docker和Kubernetes,并揭秘基于Docker容器的云计算生态圈底层技术的图书,我们感到非常荣幸。浙江大学SEL实验室云计算团队在此向所有支持帮助我们的朋友表达最诚挚的谢意,没有大家的支持,我们很可能无法顺利地完成这项工作。

感谢浙江大学软件学院杨小虎院长对云计算团队一直以来的关怀和支持,杨院长的远见卓识和诲人不倦令人钦佩。

感谢以极大热情参与到本书写作中的浙江大学计算机学院、软件学院的各位博士、硕士研究生:张磊、何思玫、高相林、张浩、孙健波、王哲、冯明振、乔刚、杜军、仇臣、周宇哲、叶瑞浩、赖春彬、孙宏亮、陈星宇。他们的热情是我们团队活力的源泉,他们使那些分散在各个领域的技术得以整合。在本书编写过程中,他们不计个人得失地精诚合作,这是本书得以成书的基石。

特别要感谢不辞辛劳为本书出谋划策、日以继夜不断审阅修改的图灵公司的编辑们。在整个写作过程中,我们团队得到了出版方的大力支持。他们认真负责的态度是本书顺利出版的保证。

感谢InfoQ主编郭蕾一直以来对浙江大学SEL实验室技术分享工作所做出的支持和推广,他和InfoQ同事们的鼓励是推动本书发起的一大动力。

感谢《第一本Docker书》的译者刘斌为本书进行了细致的审读,并为我们提出了宝贵的修订建议。

感谢浙江大学SEL实验室云计算团队的其他所有人,他们认真负责的工作态度和令人满意的工作成果是本书不可或缺的支持力量。

感谢大家的共同努力,让我们的成果得以面世,在Docker布道之路上贡献出了自己的光和热,传播惠及当下的云计算前沿技术。

丁轶群

于浙江大学玉泉校区

评论

本文目前还没有评论……

我要评论

需要登录后才能发言
登录未成功,请修改提交。