前言
为什么要写这本书
Docker 技术可谓是近年最火热的技术之一,铺天盖地的技术论坛和各种讲座,大家都在分享关于如何容器化及如何使用Docker优化自己运维和开发流程的经验。随着Docker技术的逐渐普及,使用Docker已经不再是一个难题。现在更加重要的是生产环境容器化的最佳实践,另外就是容器的编排框架之争。但是,对于技术人员来说,除去Docker外表的繁华,什么是容器,容器到底是怎么创建的,容器底层的技术探秘也是非常重要的。
我在2014年开始接触Docker,经历了从最初的新奇ü 感叹竟然还有Docker 这样的好工具,到逐渐熟悉Docker的各种功能,尝试在生产环境中使用Docker技术的过程。但是,每每被人问到:“Docker技术到底是怎么实现的呢?”我只能粗粗浅浅地说:“Docker是使用Linux Kernel的Namespace 和Cgroups实现的一种容器技术。”那么,什么是Namespace,什么是Cgroups,Docker是怎么使用它们的,容器到底是怎么一步步被创建出来的?问到这些,我就会支支吾吾地不知所以。由此可见,了解容器技术的底层技术,然后明白它们是如何工作的,尤为重要,这些才是整个容器技术的基石,掌握了这些基石才能更加容易地向上攀登。
单单讲解底层的技术实现细节和源码解读是很枯燥的一件事,一般来说很难有耐心去一点点细读然后揣摩其中的奥妙,这样囫囵吞枣地过一遍技术细节,作用不大。因此,我便萌生了写一本《自己动手写Docker》这样的书的想法。本书不去刻意讲解容器技术的细节,用到什么讲解什么,点到为止,更加细节的内容留给读者自己探索。通过阅读本书,可以一步步地了解容器技术的实现细节,更可以一步步地用自己的代码去实现它。本书最大的乐趣莫过于用自己最新了解到的知识去动手实现自己的容器。由此可以进一步打开你进入容器技术社区的大门。
本书的内容
本书的目的是去引导读者通过学习容器技术的实现细节,一步步去构建一个简单的容器。从这个过程中,了解整个容器技术领域和实现细节。本书注重原理的讲解与实践,每一部分都会有详细的代码解析,力争用最少、最精简的代码,帮助读者构建自己的容器。
本书的内容主要分为“容器与开发语言”“基础技术”“构造容器”“构造镜像”“构造容器进阶”“容器网络”“高级实践”这7章。
容器与开发语言:主要介绍Docker的基本功能和特点,并且对后面即将使用的Go语言做一个简单的介绍。
基础技术:主要介绍实现容器的底层技术,如Namespace、Cgroups、Union File System。每一节都会有文字性介绍,并且附有一个简短的小例子程序,介绍在容器上是如何使用这项技术的,方便读者清晰地理解各个技术点在容器上的作用。
构造容器:使用前面两章介绍的基础技术,构造一个最简单的容器环境,会将整体实现细节及代码解析一点点展现,直接使用前面介绍的基础技术,从而更加有实战感。
构造镜像:使用2.3节介绍的分层文件系统技术,构建一个简单的容器镜像,体现容器镜像的分层思想。
构造容器进阶:更加贴近真实的容器实现,在原来的基础上,增加更丰富的功能。通过这一章的学习,读者可以更好地了解各种技术是如何整合在一起去实现容器整体功能的。
容器网络:除实现一个容器环境之外,这一章还会讲解如何使自己的容器和宿主机通信,以及如何让不同的容器之间进行通信,更加贴近真实环境。
高级实践:使用自己编写的容器,运行一些通用程序,验证容器的可用性。此外,本章还介绍了目前Docker使用的容器运行引擎,以及目前容器运行态引擎的概况。
适用读者
希望更加深入地了解容器技术的读者。
已经使用过Docker,希望探查细节的读者。
Go语言程序员,了解如何使用Go语言来编写自己的容器。
容器技术爱好者。
如何阅读
由于本书的定位是自己动手写Docker,侧重于实战,因此仅仅纸面阅读是无法体会所有要点的。所有的源码均托管在http://github.com/xianlubird/mydocker,您可以在这里下载到本书的所有源码。每一章节都会有一个对应的tag,建议您在阅读书中讲解内容的同时,也将代码下载下来,在本机尝试运行,了解整个代码的运行流程。我们非常欢迎向本项目提交Pull Request,在阅读思考中不断交流学习。
关于勘误
由于时间和水平都比较有限,因此本书难免会存在一些纰漏和错误。如果读者发现了问题,请及时与我们联系,我们也会在后面的版本中加以改正,邮箱是xianlubird@gmail.com。非常希望与大家共同学习容器技术。
致谢
最后,向本书编写过程中给予我们巨大帮助的人们表示诚挚的感谢。感谢女友的支持,没有她包揽所有家务,我不会有大量空余时间编写此书。感谢同事姜继忠和谢瑶瑶对于本书containerd和Kubernetes相关章节内容的支持。感谢阿里云容器服务团队在本书编写期间给予的理解与包容。最后,感谢张春雨编辑,是他的帮助与支持才使得本书由一个想法变成了实体,展现给各位读者。
陈显鹭