前言

在过去一年,行业和用户对Docker(既是一项技术又是一家公司)的认识大有提升。可以这么说,它是我在职业生涯中见过的发展最迅猛的技术,采用速度之快前所未有。这项技术在一些重要企业已得到了采用,并得到了包括微软和谷歌在内的各大软件厂商的认可。这家公司获得了大笔资金,不惜投入巨额,通过研发来提高该技术的易用性,包括改进网络功能。2014年,Docker甚至投入了相当大的精力,打造正规的合作伙伴体系。
本文着重介绍了我认为的最佳使用场合,它们都基于第一手经验和反复试验。

Docker的主要好处

Docker提供了轻量级虚拟化技术,而开销几乎为零。这因此带来了一些颇有影响力的优点。
首先,你可以得益于Docker提供的额外一层抽象机制,没必要为开销而操心。下一大优点在于,你在单单一个机器上运行的容器数量比光借助虚拟化技术要多得多。
另一大影响就是,容器的构建和拆卸可以在短短几秒内完成。Docker常见问题解答(FAQ)全面介绍了Docker为传统容器增添的特性。
总之,Docker功能分为这几大类:

  • 将应用程序便携式部署成单一对象,而不是进程沙箱;
  • 以应用程序为中心,而不是以机器/服务器为中心;
  • 支持容器自动化构建;
  • 内置版本控制功能;
  • 可重复使用的组件;
  • 共享容器的公共注册中心;
  • 借助已发布的API,建立日益庞大的工具生态系统。

在我看来,真正让Docker与众不同的特点在于,分层文件系统以及将版本控制应用到整批容器的功能、能够跟踪、恢复和查看变更。总的来说,这也是软件开发方面一项备受欢迎、广泛使用的特性。Docker将同样这个概念扩展到了更高层面,整个应用程序及其所有依赖项都在单单一个环境中,这是前所未有的。

Docker的主要使用场合

下面仅仅是几个使用场合,它们借助Docker这项支持性技术提供了一致的环境,而开销很小。

1、简化配置

Docker倡导的主要使用场合是简化配置。虚拟机的一大优点在于,能够在你的基础设施上运行任何平台,虚拟机有自己的配置。
Docker提供了同样这项功能,却没有虚拟机的开销。它让你可以将环境和配置放入到代码中加以部署。同样的Docker配置还可以用在各种环境中。这将基础设施需求与应用程序环境分离开来。
可以自由地在多个IaaS/PaaS上运行应用程序,又不需要任何的额外改动,这是Docker可以帮助你实现的终极目标。
如今,从亚马逊到谷歌,每家IaaS/PaaS提供商都支持Docker。知名厂商纷纷看好Docker。现在,轮到你得益于同样这些选择了。

2、代码流水线管理

前一种使用场合给代码流水线管理带来了重大影响。随着代码从开发人员的机器进入到生产环境,它在一路中要经历许多不同的环境。这每一个环境会略有差异。
从开发环境直到生产环境,Docker为应用程序提供了始终一致的环境,因而简化了代码开发和部署流水线。
Docker映像不可改变的特性以及易于构建,可以帮助你实现从开发环境直到生产环境,应用程序的运行环境都不发生变化。

3、提高开发人员的生产力

这进而让Docker为提高开发人员的生产力这个使用场合带来了一些额外优势。想了解详细的例子,你可以参阅我在DockerCon 2014大会上的演讲。
在开发环境中,我们有两个彼此冲突的目标:

  • 我们希望尽可能接近生产环境;
  • 我们希望开发环境尽可能快速,以便交互式使用。

理想情况下,想实现第一个目标,我们就需要每个服务都在自己的虚拟机上运行,体现生产环境的应用程序是如何运行的。然而,我们又不想每当需要编译时总是需要互联网连接,总是添加远程工作带来的开销。

这时候,开销很低的Docker派得上用场。开发环境的内存容量通常很低;由于并不增加内存占用空间(使用虚拟机通常会增加内存占用空间),Docker可以轻松让几十个服务运行。

想实现第二个目标,为了提供快速反馈回路,我们使用Docker的共享卷,从容器的主机操作系统――这是虚拟设备虚拟机(通常是Vagrant设备),将应用程序代码提供给一个或多个容器。应用程序源代码则使用Vagrant的与主机操作系统(Windows、Mac或Linux)同步的文件夹,提供给容器主机操作系统(Vagrant设备)。

这种方法有诸多好处。开发人员可以从他所选择的平台(Windows、Mac或Linux)编辑源代码,还能够立即查看变化,因为运行的应用程序使用同样的源代码,运行环境则在使用一个或多个Docker容器的Vagrant设备里面设置。

此外,这种方法可以帮助不是非常了解后端细节的前端工程师轻松使用全面的应用程序架构,致力于他感兴趣的方面,不需要操心设置或安装方面的烦心事。另外,它提供了一种机会,可以进一步探究后端系统在底层是如何工作的,以便更深入地了解整个架构。

不妨更深入地细述这种方法。我们谈论的Vagrant设备可能是普通的操作系统发行版,它通过Vagrant文件(Vagrantfile)加以全面配置。或者,它也可能是一个定制设备,在某种程度上进行了预先配置,然后我们在需要Vagrant时,可以使用Vagrant文件加以进一步配置。

如果你希望不依赖网络,构建一切都已预先配置好的定制设备是条出路。这种方法的唯一缺点是,虚拟机设备很庞大,而且环境未更新过。

你想实现第一个目标(尽量缩小开发和生产的不一致)时需要考虑的另外一点是,制定一项策略来进行数据库转储,那样应用程序的各个部分都面面俱到。这就好比我们在测试覆盖方面力争实现的。仅仅获得随机性子集并不是最佳解决办法。你需要一项策略,与你应用程序的所有相关特性相一致。

如果你可以获得完整的数据库转储,那也是一条出路。但在大数据盛行的当下,你几乎做不到这一点。你需要一个子集来处理或测试。

4、应用程序隔离

可能有诸多原因让你到头来在同一个机器上运行多个应用程序。前面提到的提高开发人员的生产力就是这样一个例子。不过也有其他的使用场合。
值得考虑的几个此类使用场合包括:合并服务器以降低成本,或者逐步计划将整块式应用程序划分成几个分离的部分。
比如说,假设你需要运行两台REST API服务器,它们都使用flask框架。但每一台服务器使用版本略有不同的flash及其他此类依赖项。在不同的容器下运行这些API服务器提供了一种简单的出路,可以克服所谓的“依赖性地狱”(dependency hell)。

5、服务器合并

就像使用虚拟机来合并多个应用程序一样,Docker的应用程序隔离功能可以合并多台服务器,以节省成本。然而,由于没有多个操作系统的内存占用空间,又能够在诸实例之间共享闲置未用的内存,Docker提供的服务器合并效果比借助虚拟机所能实现的好得多。
新一代灵活定制的平台即服务(PaaS,比如Heroku、Elastic Beanstalk和App Engine)都使用容器的这些强大功能,现在有了Docker,这些功能触手可及。
此外,Deis、Kubernetes、Cadvisor、Panamax及其他开源项目使得部署和监控代表多层应用程序架构的大量容器易于管理。

6、调试功能

Docker提供了未必是容器所特有的许多工具,但是它们与容器概念很搭。它们还提供了极其有用的功能。这包括:能够检查容器和容器版本,另外还能让两个容器有所不同。这在修复应用程序时大有用处。
Flux7.com就在Docker容器里面运行。我们的Web开发人员告诉我们,一次崩溃的根源是他从用户界面推送到functions.php文件的代码变更。我在短短一分钟内建立起了开发环境,让这位Web开发人员能够在沙箱里面进行调试。他稍后对我们表示一切OK后,我们就能切换回到网站的最新版本,这要归功于Docker和Linux容器。
虽然这个过程可以使用另一种策略来解决,但是使用Docker却是解决这个问题的一种高效方法。另外,它也是我们实施在前端功能至关重要的许多客户部署环境的一种方法。

7、多租户模式

不过Docker另一种值得关注的使用场合是,它可以用在多租户应用程序中,因而避免了对应用程序进行重大改写。
我们自身的例子就是,为一款物联网应用程序开发便捷的多租户架构。这种多租户应用程序的代码库要复杂得多,缺乏灵活性,难以处理。重新设计应用程序的架构不仅耗费时间,还耗费大量钱财。
使用Docker,就很容易为每个用户建立用来运行应用程序层多个实例的隔离环境,而且成本低廉。这之所以有可能,是由于Docker环境可以迅速构建,另外由于易于使用的API,我们可以使用这些API,通过编程来启动容器。我们使用了docker-py,这个Python库有助于通过Web应用程序界面,与Docker守护程序进行交互。

8、快速部署

在虚拟机出现之前,配置新的硬件资源需要数天。虚拟化将这个时间缩短到了几分钟。Docker更是缩短到了短短几秒钟,因为它只需要为这个过程创建容器,并不启动操作系统。正是这项支持性技术,促使谷歌和Facebook使用容器。
实际上,你可以在数据中心里面创建和销毁资源,不用操心再次构建所需的成本。由于数据中心的利用率通常只在30%左右,很容易使用更积极地分配资源的方法,提高这个数字。另外,配置新实例的成本很低,允许更积极大胆地分配资源。
此外,Docker映像不可改变的特性让你吃下了定心丸:一切都将完全以之前的方式正常运行。

结束语

还有更多的使用场合表明Docker是一种合适的解决方案,包括从确保安全到助力开发人员,不一而足。本文着重介绍了我们认为给实际项目增添重大价值的使用场合。
从运行API服务器和Web应用程序,到运行采用计算统一设备架构(CUDA)的应用程序和功能完备的高清桌面云可视化(High Definition Desktop Cloud Visualization),你可以从运行中的容器里面使用GPU,Docker提供了一系列广泛的使用场合。Docker让Linux容器化技术易于访问和易于使用,而且更重要的是,让这项技术易于管理。

对我们来说,使用Docker的动机总是在于使用适合某个项目的工具。最值得关注的方面在于业务理由,然后我们根据业务理由来构建系统。