序
我是阿里云容器服务团队的架构师易立,很荣幸为这本书作序。
当显鹭等几位同学跟我谈起他们想写一本介绍如何从头打造一个Docker引擎的书时,我有些担心这样的内容是不是太小众,毕竟绝大多数读者都是Docker的使用者而非开发者。然而读完样章,看到这三位同学笔下翔实的内容,文中透出的热情和自信打消了我的顾虑。
Docker是技术圈中的当红小鲜肉。自从2013年横空出世以来,迅速在开发者社区流行开来。在2016年9月,Docker镜像在DockerHub的总下载量就已经超过了60亿次,并且以每6周10亿次的速度迅速增长。
大家都知道Docker技术脱胎于LinuxContainer(LXC)技术,在LXC的发展过程中,IBM、Google、Redhat、Canonical等技术巨擘做出了众多的贡献。然而,Docker到底有什么魔力,能够在这么短的时间之内就风靡了整个技术圈呢?
Docker公司的创始人兼CTO—SolomonHykes,有机地把一系列技术CGroup、Namespace和UnionFS整合起来,极大地降低了容器技术的复杂度,简化了开发者用户体验。他敏锐地预测到一旦标准化容器技术最终出现,整个技术行业将会受到怎样深远的影响。Docker公司开源了DockerEngine,定义了一个以容器镜像为标准的应用打包格式;并且建立DockerHub服务进行镜像分发和协作。这些举措迅速创建了一个良好的社区和合作伙伴生态圈,包含AWS、Google、Microsoft、IBM和国内的众多公司。在短短几年的时间内,Docker几乎成为了容器技术的代名词。
“得标准者得天下”,容器底层标准化之争风云再起。2014年底,CoreOS推出rkt容器引擎,试图挑战Docker另立标准。Docker在2015年6月宣布成立OCI(OpenContainerInitiative)组织作为Linux基金会的协作项目,并将其容器标准和runtime参考实现(RunC)贡献出来,旨在围绕容器格式和运行时制定一个开放的工业化标准。这一举措化解了社区在容器标准上的第一次分歧。
随着容器技术的快速发展,技术生态逐渐从围绕单机环境构建和运行容器化应用,发展为支持大规模容器编排技术。云平台成为了分布式网络操作系统,而容器成为了“进程”执行单元,可以动态地运行在不同宿主机环境中。其中,Kubernetes、Mesos、Docker诸强争霸,各有所长。2016年6月,Docker宣布开始在DockerEngine中内置Swarmmode,这极大地简化了容器编排的复杂性,但也遭到了社区的强烈反对。Google发起CRI(ContainerRuntimeInterface,容器运行时接口)项目,通过shim的抽象层使得调度框架支持不同的容器引擎实现。Mesos推出了Uni?dContainerizer,以支持Docker、Appc、OCI等不同的镜像格式,而无须再依赖DockerEngine。
面对这些挑战,2016年12月14日,Docker公司宣布将DockerEngine的核心组件Containerd捐赠到一个新的开源社区,任其独立发展和运营,目标是提供一个标准化的容器runtime,其注重简单、健壮性和可移植性。由于Containerd只包含容器管理最基本的能力,因此上层框架可以有更大的灵活性来提供容器的调度和编排能力。阿里云、AWS、Google、IBM和Microsoft会作为Containerd的初始成员,为项目贡献力量。
在技术爆发的年代,新技术层出不穷,而快餐式的阅读和了解无法帮助我们梳理和把握发展的脉络。对一些核心技术既要知其然也要知其所以然,这样才能举一反三,对技术趋势建立起自己的理解和判断。了解容器基础知识,可以深入理解容器在进程管理、资源管理、安全隔离等方面与传统方式的不同,也有助于了解容器在网络、存储、安全等方面的特殊性。
最好的学习方式莫过于自己亲手实践。计算机界的泰斗AndrewTanenbaum教授为教学而构建了Minix,而这也启发了LinusTorvalds大神创造了Linux。我们期待同学们能够从本书循序渐进的讲解中学习容器相关的技术细节,深入理解Docker的底层技术实现,围绕容器技术实现创造性的扩展和应用。
易立
2017年1月
为什么要写这本书
Docker技术可谓是近年最火热的技术之一,铺天盖地的技术论坛和各种讲座,大家都在分享关于如何容器化及如何使用Docker优化自己运维和开发流程的经验。随着Docker技术的逐渐普及,使用Docker已经不再是一个难题。现在更加重要的是生产环境容器化的最佳实践,另外就是容器的编排框架之争。但是,对于技术人员来说,除去Docker外表的繁华外,什么是容器,容器到底是怎么创建的,容器底层的技术探秘也是非常重要的。
我在2014年开始接触Docker,经历了从最初的新奇—感叹竟然还有Docker这样的好工具,到逐渐熟悉Docker的各种功能,尝试在生产环境中使用Docker技术的过程。但是,每每被人问到:“Docker技术到底是怎么实现的呢?”我只能粗粗浅浅地说:“Docker是使用LinuxKernel的Namespace和Cgroups实现的一种容器技术。”那么,什么是Namespace,什么是Cgroups,Docker是怎么使用它们的,容器到底是怎么一步步被创建出来的?问到这些,我就会支支吾吾地不知所以。由此可见,了解容器技术的底层技术,然后明白它们是如何工作的,尤为重要,这些才是整个容器技术的基石,掌握了这些基石才能更加容易地向上攀登。
单单讲解底层的技术实现细节和源码解读是很枯燥的一件事,一般来说很难有耐心去一点点细读然后揣摩其中的奥妙,这样囫囵吞枣地过一遍技术细节,作用不大。因此,便萌生了写一本《自己动手写Docker》这样的书的想法。本书不去刻意讲解容器技术的细节,用到什么讲解什么,点到为止,更加细节的内容留给读者自己探索。通过阅读本书,可以一步步地去了解容器技术的实现细节,更可以跟着作者一步步地用自己的代码去实现它。本书最大的乐趣莫过于用自己最新了解到的知识去动手实现自己的容器。由此可以进一步打开你进入容器技术社区的大门。
本书的内容
本书的目的是去引导读者通过学习容器技术的实现细节,一步步去构建一个简单的容器。从这个过程中,了解整个容器技术领域和实现细节。本书注重原理的讲解与实践,每一部分都会有详细的代码解析,力争用最少最精简的代码,帮助读者构建自己的容器。
本书的内容主要分为“容器与开发语言”“基础技术”“构造容器”“构造镜像”“构造容器进阶”“容器网络”“高级实践”这7章。
容器与开发语言:主要介绍Docker的基本功能和特点,并且对后面即将使用的Go语言做一个简单的介绍。
基础技术:主要介绍实现容器的底层技术,如Namespace、Cgroups、UnionFileSystem。每一小节都会有文字性介绍,并且附有一个简短的小例子程序,介绍在容器上是如何使用这项技术的,方便读者清晰地理解各个技术点在容器上的作用。
构造容器:使用前面两章介绍的基础技术,构造一个最简单的容器环境,会将整体实现细节及代码解析一点点展现,直接使用前面介绍的基础技术,从而更加有实战感。
构造镜像:使用2.3节介绍的分层文件系统技术,构建一个简单的容器镜像,体现容器镜像的分层思想。
构造容器进阶:更加贴近真实的容器实现,在原来的基础上,增加更丰富的功能。通过这一章的学习,读者可以更好地了解各种技术是如何整合在一起,去实现容器整体功能的。
容器网络:除了实现一个容器环境之外,这一章还会讲解如何使自己的容器和宿主机通信,以及如何让不同的容器之间进行通信,更加贴近真实环境。
高级实践:使用自己编写的容器,运行一些通用程序,验证容器的可用性。此外,本章还介绍了目前Docker使用的容器运行引擎,以及目前容器运行态引擎的概况。
适用读者
希望更加深入地了解容器技术的读者。
已经使用过Docker,希望探查细节的读者。
Go语言程序员,了解如何使用Go语言来编写自己的容器。
容器技术爱好者。
如何阅读
由于本书的定位是自己动手写Docker,侧重于实战,因此仅仅纸面阅读是无法体会所有要点的。所有的源码均托管在github.com/xianlubird/mydocker,您可以在这里下载到本书的所有源码。每一章节都会有一个对应的tag,建议您在阅读书中讲解的同时,也将代码下载下来,在本机尝试运行,了解整个代码的运行流程。我们非常欢迎向本项目提交PullRequest,在阅读思考中不断交流学习。
关于勘误
由于时间和水平都比较有限,因此本书难免会存在一些纰漏和错误。如果读者发现了问题,请及时与我们联系,我们也会在后面的版本中加以改正,邮箱是xianlubird@gmail.com。非常希望与大家共同学习容器技术。
致谢
最后,向本书编写过程中给予我们巨大帮助的人们表示诚挚的感谢。感谢女友的支持,没有她包揽所有家务,我不会有大量空余时间编写此书。感谢同事姜继忠和谢瑶瑶对于本书containerd和Kubernetes相关章节内容的支持。感谢阿里云容器服务团队在本书编写期间给予的理解与包容。最后,感谢张春雨编辑,是他的帮助与支持才使得本书由一个想法变成了实体,展现给各位读者。
陈显鹭
Doldrums_ 2017-07-10
之前看过他们在阿里云的社区上的博客,很不错,现在出书了买一本,内容挺深入,适合对Docker原理感兴趣的读读。