3.1 容器的出现
控制组和命名空间是实现容器的主要成分。控制组对一个进程可以使用的资源量(如CPU、内存等)进行限制,而命名空间则控制一个进程可以看到的东西(如挂载、进程、网络接口等)。这两个基元自2008年以来一直在Linux内核中(就命名空间而言,甚至更早)。那么,为什么我们今天所知道的容器在几年后才开始流行呢?
为了回答这个问题,我们首先需要考虑当时围绕软件和IT行业的环境。最初要考虑的一个因素是应用程序的复杂性。应用程序开发人员使用面向服务的架构构建应用程序,甚至开始接受微服务。这些架构给组织带来了各种好处,如可维护性、可扩展性和生产效率。然而,它们也导致了构成一个应用程序的组件数量的激增。有意义的应用程序可以很容易地涉及十几个服务,可能是用多种语言编写的。正如你可以想象的那样,开发和交付这些应用程序曾经是(并将继续是)复杂的。另一个需要记住的因素是,软件很快就成为一个业务差异化的因素。你能越快推出新功能,你的产品就越有竞争力。拥有以可靠方式部署软件的能力是企业的关键。最后,作为托管环境的公共云的出现是另一个重要因素。开发人员和运营团队必须确保应用程序在所有的环境中表现相同,无论是开发人员的笔记本电脑还是在别人的数据中心运行的生产服务器。
考虑到这些问题,我们可以看到这个环境是如何成熟地进行创新的。让我们把目光转向Docker。Docker让大众都能使用容器。它建立了一个抽象概念,使开发者能够通过一个易于使用的CLI来构建和运行容器。开发人员不需要知道利用容器技术所需的低级内核结构,他们所要做的只是在终端输入docker run。
虽然这不是所有问题的答案,但容器改善了软件开发生命周期的许多阶段。首先,容器和容器镜像允许开发人员对应用程序的环境进行编码。开发人员不再需要与缺失或不匹配的应用程序的依赖关系作斗争。其次,容器通过为测试应用程序提供可重复的环境来影响测试。最后,容器使软件部署到生产中变得更加容易。只要在生产环境中有一个Docker引擎,应用程序就可以在最小的兼容性问题下被部署。总的来说,容器帮助企业以一种更可重复和高效的方式将软件完成从零到生产的交付。
容器的出现也催生了一个丰富的生态系统,其中充满了不同的工具、容器运行时、容器镜像注册表等。这个生态系统广受好评,但也带来了一个新的问题:我们如何确保所有这些容器解决方案都能相互兼容?毕竟,封装和可移植性保证是容器的主要好处之一。为了解决这个难题并提高容器的采用率,业界聚集在一起,在Linux基金会下合作制定了一个开源规范:开放容器倡议。