Docker开发指南 封面 如果在3年前,你不知道什么是Docker,还是情有可原,因为Docker那时候才出现一年不到的时间。但如果是现在(2017年中),你还没听说过Docker,那么就有些落伍,需要赶紧为自己充充电了。


  • 容器

本书第一部分提到的第一个概念并不是Docker,而是容器。容器是什么,为什么我们要先了解容器?容器是对应用程序及其依赖关系封装。容器看上去像一个轻量级的虚拟机,但容器和虚拟机相比有几个优点:

  1. 启动和停止快,比如openstack能够以10台/min的速度创建虚拟机,而Docker一般启动一个容器的时间在几十毫秒(谁用谁知道)。
  2. 可移植,使得开发、测试环境和生产环境保持一致。以Python开发为例,《Python项目开发实战》在一开始教我们搭建开发环境的时候就要用virtualenv来保持一个独立的开发环境,使得python的版本、python第三方包的版本能够保持在一个相对“纯净”的环境里,但是在测试和生产环境你还是要如样构建一个virtualenv的环境才能保证你的程序能够换个地方也能正常运行。再以Node.JS开发为例,Node.JS的版本迭代很快,要想在不同版本之间切换,就要用NVM或n这样的工具。总之,在容器出现以前切换版本、开发环境,保持开发、测试、生产环境一致是一件很费力的事情。但是,有了容器之后就不同了,我们可以把当前配置好的容器发布成镜像,然后再在测试或者生产环境下启动成容器就可以了,保持绝对的一致!
  3. 在一台机器上可以启动大量的容器,模拟分布式生产环境。以MongoDB为例,为了保证生产环境下的可用性,MongoDB要求我们在生产环境下至少保证一主二从的模式,没有容器的时代,我们要么真去找3台机器来模拟,要么就得起三个虚拟机来运行。而一台普通开发计算机上的资源毕竟是有限的,能跑的虚拟机也是很有限的,一旦你的分布式架构复杂起来了,要想拿一台开发机模拟就有点费劲了。而容器则是轻量级的,一台开发机上跑个几百上千个容器还是小case,再结合容器网络和编排工具,模拟分布式生产环境也是很轻松的事情。
  4. 可以下载并运行复杂的应用程序。一般我们学习或使用某个工具比如MongoDB/Redis/RabbitMQ/Jenkins啊,书里的第一步都是教你怎么下载、配置环境、安装……,现在就很轻松了,敲个docker pull mongo 就能把MongoDB的镜像下载下来,再敲个docker run mongo就能运行MongoDB控制台了。so easy!

  5. 微服务(参见《微服务设计》)是最近几年的热门概念,是容器最主要的用例,也是容器技术兴起的最大推动力。容器与生俱来的轻量级特性及速度,意味着它尤其适合用于微服务架构。与虚拟机相比,容器的体积小很多,并且能快速部署,这使得微服务架构能使用最少的资源,又能迅速应对需求的变化。所以这几年来,提到微服务的地方,几乎都少不了容器的身影。


  • Docker与容器

容器并不是新概念,几十年来,UNIX 系统一直以 chroot 命令来提供简单的文件系统隔离。但是,直到Docker的诞生,补充了以往容器化技术的不足,将容器技术带入主流,并且使Docker成为了容器技术的代名词。Docker 引擎提供了快速且便捷的CLI以及API用来运行容器,而Docker Hub 提供大量的公共容器镜像以供下载,方便用户快速上手,避免了大量重复劳动。Docker 为软件开发带来了翻天覆地的变化。假如没有 Docker,可能容器将仍是一种鲜为人知的技术。

Docker的哲学经常用航运集装箱的比喻来解释,其目标是把集装箱的标准化流程运用到 IT行业中去。Docker 容器简化了“移动”应用程序的工作,好比联运集装箱简化了货物运输一样。开发者只需要专注于程序开发,再也不用担心测试与正式发布时环 境及依赖关系的差异所带来的问题。 图2 码头工人与集装箱


  • Docker基础

第二章介绍Docker的安装,不过安装最新版Docker请到官网的下载地址,请按官网的步骤进行。第三章教你体验一些Docker的基本操作,主要是走马观花,也不是本书的主要方面,要想详细了解可以参阅《Docker基础与实战》,对于Docker指令的熟悉还是要在实战中逐步积累。

第四章介绍Docker的基本概念,诸如镜像、守护进程、网络连接、数据卷等都是玩Docker每时每刻都要打交道的概念,还有Swarm、Compose、Machine、服务发现、服务编排这些进阶概念,对于这些概念的深度介绍可以参见《Docker——容器与容器云》。


  • Docker与软件生命周期

本书第二部分将告诉我们如何将Docker 整合到软件开发过程中,而且会是我们在实战过程中熟悉Docker的各种概念和指令。要充分的利用 Docker 的功能,就需要采用 DevOps 的思维。在开发的过程中,我们要思考在生产环境中软件将如何运行,如何做能够减轻部署到各种环境时将要面临的痛苦,这也是本书名称叫《Docker开发指南》的原因。

第5章对于熟悉Python的同学来说比较容易上手但也有一些不一样,本章要通过轻量级的Flask跑一个“Hello World”。与《Flask Web开发》 里介绍的安装步骤不一样,在Docker里安装Flask是不需要安装virtualenv,因为容器已经提供了隔离环境。本章教我们用Python官方镜像快速创建一个可移植和可重复创建的Flask镜像,我们可以使用数据卷来动态修改容器中的代码,通过容器轻松的同时维护生产环境和开发环境,最后可以通过使用 Compose 将开发流程自动化。

在第6章里,我们马上可以把上面这个镜像应用起来,再把identicon加入进来,再用compose把我们创建的identidock容器与dnmonster容器连接起来,再添加一个redis我们就可以为这个系统添加缓存微服务。就像搭积木一样,三个容器三个微服务构成了一个微服务架构的系统,这种系统很适合横向扩展到多台机器。由于每个容器/微服务各自独立,所以将其中的微服务被其他效能更高且功能相同的服务替代。在发生意外情况的时候,可以只对部分微服务进行回滚,无需把系统的其他部分一并关闭。还有一点就是,我们看到不同的微服务可以用不同的语言实现,使我们能够选择适用于手头任务的语言。

第7、8、9、10章分别涉及镜像分发、持续集成与测试、部署容器、日志与监控。涉及开发完成后的持续集成/测试/生产的过程。在DevOps里,前一段是开发,后一段就是运维以及不断的持续迭代。跟着这几章走下来,你就会发现容器天生就适用于持续集成与持续交付的工作流。


  • Docker 容器集群

在真正的生产环境里的分布式系统不会只有一台服务器,更不会只有一个容器,你还得应付潜伏着的黑客,所以联网和服务发现、编排、集群和管理、容器安全与限制容器都是必不可少的内容。

服务发现在现今的分布式和动态系统中往往是必不可少的功能。容器和服务都会不断变化,它们会因需求或故障而被停止、启动和迁移。而方案也有很多种,到底是zookeeper还是etcd,究竟什么是正确的选择,很大程度取决于你的特定需求和你所使用的平台。

现在市面上常见的集群和编排工具有:Swarm、fleet、Kubernetes 和 Mesos,第12章依次介绍了它们的独特功能。Swarm 的优点在于它使用了标准的 Docker 接口。这使得无论是使用它还是把它整合到现有的工作流程都非常容易。fleet 是一个低阶并且相当简单的编排层,可以作为运行更高阶的编排工具(如 Kubernetes)或定制系统的基础。Kubernetes 作为一个编排工具,它自带服务发现和复制的功能,并且很坚持自己的一套设计理念。使用它时或许需要对现有应用程序重新设计。Mesos 则支持多个容器编排框架,包括 Marathon、Kubernetes 和 Swarm。

为了能够安全地使用 Docker,防止被黑,我们必须对潜在的安全问题有清楚的认识,并且对保护容器化系统的主要工具和技术有所了解。第13章在安全性方面给了我们不少建议,需要我们注意。在安全性方面,容器技术提供了正面作用,因为它能够提供多一重隔离和控制。无论在什么时候,正确使用容器的系统只会比没有使用容器的系统更安全。

关于容器集群实战的更多信息,可以参阅《Docker经典实例


以本书的篇幅而言,不可能是一本Docker百科大全,因为Docker/容器/微服务/CI/CD/DevOps涉及到的东西实在是太杂太多,所以不可能由一本书进行全覆盖,事实上目前也没有这样一本Docker百科全书。但本书以DevOps的思想出发,以实战的方式指导,涉及到了从Docker开发到运维的方方面面,实在是一本不可多得的好书。