关于本书
Docker可以说是目前增长速度最快的软件项目。它于2013年3月开源,到2018年它已经在GitHub上获得了近50 000个星以及超过14 000次fork。它还接受了大量像Red Hat、IBM、微软、谷歌、思科和Vmware这些厂商的拉取请求(pull request)。
Docker在这个关键时刻的出现正是为了迎合许多软件组织的一个迫切需求:以一种开放和灵活的方式来构建软件,然后在不同环境下能够可靠和一致地部署它。用户不需要学习新的编程语言、购买昂贵的硬件,也无须再为了用Docker构建、分发和运行可移植的应用而在安装或配置过程上花费过多精力。
本书将会通过我们在不同场景下用到的一些技术,带读者领略真实世界里的Docker实践案例。我们已经竭力尝试阐明这些技术,尽可能做到无须在阅读前事先具备其他相关技术的知识背景。我们假定读者了解一些基本的开发技术和概念,如开发一些结构化代码的能力,以及对软件开发和部署流程的一些了解。此外,我们认为读者还应了解一些核心的源代码管理理念,并且对像TCP/IP、HTTP和端口这样的网络基础知识有基本的了解。其他不怎么主流的技术会在我们介绍到的时候予以说明。
我们将从第一部分介绍Docker的基础知识开始,而到了第二部分,我们将把重点放在介绍如何将Docker用到单台机器的开发环境。在第三部分里,我们将介绍Docker在DevOps流水线中的用法,介绍持续集成、持续交付和测试的内容。第四部分介绍如何通过编排以一种可扩展的方式运行Docker容器。第五部分介绍在生产环境运行Docker的过程,重点介绍标准的生产环境运维的选项、可能出现的问题以及如何处理。
Docker是一个用途广泛、灵活和动态的工具,以至于没有一点儿魄力的话很难追上它快速发展的脚步。我们会尽力通过真实世界的应用和例子,让读者更好地理解其中的一些关键概念,目的是希望读者能够有实力、有信心在Docker的生态系统里审慎评估未来采用的工具和技术。我们一直在努力让阅读本书变得更像是一次愉快的旅行,即介绍我们在很多方面见证的Docker是怎样使我们的生活变得更加轻松甚至于更加有趣的。我们正沉浸在Docker以一种别致的方式为我们呈现的覆盖整个软件生命周期的许多有意思的软件技术里,而我们希望本书的读者同样也能分享这样的体验。
本书内容结构
本书包括16章,分为5个部分。
第一部分为本书的其余部分奠定了基础,介绍Docker的概念并且教读者执行一些基本的Docker命令。第2章让读者熟悉Docker的客户-服务器架构以及如何调试它,这对在非常规的Docker配置中定位问题是非常有用的。
第二部分关注让读者熟悉Docker以及在自己的机器上如何充分利用Docker。我们将用到一个读者可能比较熟悉的相关概念——虚拟机,这是第3章的基础并为读者提供一个更容易上手使用Docker的途径。然后第 4 章、第 5 章和第 6章会详细介绍几个我们发现自己每天构建镜像、运行镜像以及管理Docker本身都在使用的Docker技巧。这一部分的最后一章则通过一些配置管理技巧,探索更为深入的镜像构建方面的主题。
第三部分从关注Docker在DevOps上下文中的使用开始,从用它完成软件构建和测试的自动化到将它迁移至不同的环境。这一部分还会花一章的篇幅来总结Docker的虚拟网络,引入Docker Compose,并且覆盖一些更为高级的网络主题,如网络模拟以及Docker网络插件等。
第四部分探讨容器编排的主题。我们将带领读者从单台主机上的单个容器穿梭到一个运行在“数据中心即操作系统”上的基于Docker的平台。第13章会展开讨论选择一个基于Docker的平台时必须考虑的方方面面,它还可以作为企业架构师在思考如何实现此类技术时的参考指南。
第五部分会介绍几个针对在生产环境中如何有效地利用Docker的主题。第14章讨论的是安全性的重要话题,阐明了如何锁定在容器里运行的进程,以及如何限制访问对外公开的Docker守护进程。最后两章则会细讲一些在生产环境中运行Docker的重要实用信息。第15章会展示如何将经典的系统管理知识应用到容器上下文中,从日志记录到资源限制,而第16章着眼于一些读者可能遇到的问题并且给出对应的调试和解决步骤。
附录里则是一些以不同方式安装、使用和配置Docker的具体细节,包括在虚拟机里以及在Windows上。
代码
本书中用到的所有由作者创建的工具、应用以及Docker镜像的源代码都可以在Manning出版社的官方网站下载。Docker Hub上dockerinpractice用户下的镜像均是从其中一个GitHub仓库自动构建生成的。我们已经意识到读者可能会有兴趣对技术背后的一些源代码做进一步的研究,因此在技术讨论里也嵌入了相关仓库的链接。
为了方便读者阅读,本书中列出的大量代码均以终端会话的形式,与相应的命令输出一起展示。这些会话里有几件事情要注意一下。
- 很长的终端命令可能会使用shell的续行字符(\)将一条命令分割成多行。虽然读者直接把它贴到自己的shell下面运行也能工作,但是读者也可以略去这个续行字符,在一行里键入整条命令。
- 当输出的部分对于读者来说没有提供额外有用的信息时,它可能会被省略并在相应的位置用省略号([...])替代。