1.6.1 容器
假设你加入了某个团队,并且要参与一个应用相关的工作。你所做的第一件事情就是按照指南搭建与其他同事类似的本地开发环境。你开发完了一个新的特性,并且在质量保证(Quality Assurance,QA)环境进行了测试。验证完成之后,应用就可以部署到staging环境进行额外的测试,并最终部署到生产环境。应用要在具有一定特征的环境中运行,我们在构建时也会考虑到这一点,所以上述所有环境尽可能相似是至关重要的。那么,如何实现这一点呢?这就是容器的用武之地了。
在容器出现之前,我们需要依赖虚拟机来保证环境的可重复性、隔离性和可配置性。虚拟化的原理是使用一个Hypervisor组件来抽象硬件,从而能够在同一台机器上以隔离的方式运行多个操作系统。Hypervisor直接运行在机器硬件(type 1)或宿主机操作系统(type 2)之上。
而操作系统容器是一个轻量级的可执行包,容器中包含了应用以及运行该应用所需的所有内容。容器间共享同一个内核,因此要添加新的隔离上下文时,没有必要启动完整的操作系统。在Linux上,这是通过Linux内核所提供的一些特性来实现的:
■ Namespace用来在进程之间划分资源,所以每个进程(或进程组)只能看到机器上可用资源的一个子集。
■ Cgroups用来控制和限制进程(或进程组)的资源使用。
注意 当仅使用虚拟化的时候,硬件是共享的,但是容器还会共享相同的操作系统内核。这两种情况都提供了隔离运行软件的计算环境,尽管隔离的程度有所不同。
图1.10展示了虚拟化和容器技术的差异。
图1.10 虚拟化和容器技术的差异在于隔离上下文之间所共享的内容。虚拟机只会共享硬件,
容器还会共享操作系统内核,后者更加轻量级和可移植
对于云原生应用,容器为什么这么流行呢?按照传统的方式,要使应用运行起来,我们需要在虚拟机上安装和维护Java运行时环境(JRE)以及中间件。相反,容器几乎可以在任何计算环境中可靠地运行,独立于应用及其依赖或中间件。应用是什么类型、使用哪种语言编写、使用了哪些库,都无关紧要。从外边来看,所有容器的外形都一样,就如同货运中的集装箱。
因此,容器实现了敏捷性、跨不同环境的可移植性以及部署的可重复性。鉴于其轻量级和较低的资源需求,它们非常适合在云中运行,因为云中的应用是用完即废弃的,需要能够动态和快速扩展。相比之下,建立和销毁虚拟机的成本要高得多,并且会更加耗时。
容器!无处不在的容器!
“容器”这个词在不同的语境中有不同的含义。有时候,这种模糊性可能会产生一些混乱,所以我们看一下在不同语境中它分别是什么意思。
■ 操作系统:操作系统容器是一种在与系统其他部分隔离的环境中运行一个或多个进程的方法。在本书中,我们会主要关注Linux容器,但是需要注意Windows容器也是存在的。
■ Docker:Docker容器是Linux容器的一个实现。
■ OCI:OCI容器是由开放容器计划(Open Container Initiative,OCI)实现的Docker容器标准。
■ Spring:Spring容器指的是应用上下文,对象、属性和其他应用资源都会在这里被管理和执行。
■ Servlet:Servlet容器为使用Java Servlet API的Web应用提供了一个运行时。Tomcat服务器的Catalina组件就是Servlet容器的一个示例。
虚拟化和容器并不是互斥的。实际上,我们会在云原生环境中同时使用它们,也就是在虚拟机组成的基础设施上运行容器。IaaS(基础设施即服务)模型提供了一个虚拟层,我们可以使用它来引导新的虚拟机。在此基础上,我们可以直接安装容器运行时和运行容器。
一个应用通常是由不同的容器组成的,在开发阶段或执行一些早期的测试时,它们可以在同一台机器上运行。但是,我们很快就会遇到管理许多容器变得越来越复杂的问题,当我们需要复制它们以实现可扩展性以及跨不同的机器进行分布式部署时,这种问题就变得尤为突出。这时,我们就会开始依赖CaaS(容器即服务)模型所提供的更高层次的抽象,该模型提供了在机器集群中部署和管理容器的功能。需要注意的是,在幕后,它依然有一个虚拟化层。
即便在使用Heroku或Cloud Foundry这样的PaaS平台时,也会涉及容器。我们在这些平台上部署应用时,只需提供JAR制品,因为它们会负责处理JRE、中间件、操作系统和所需的依赖。不过,在幕后,它们会基于这些组件建立一个容器,并最终运行它。所以,区别在于,不再是我们负责建立容器,而是平台本身为我们实现这一点。一方面,这对开发人员来说是很方便的,可以减少相关的职责。但另一方面,我们放弃了对运行时和中间件的控制,并可能面临供应商锁定的问题。
在这本书中,我们将学习如何使用Cloud Native Buildpacks(它是一个CNCF项目)实现Spring应用的容器化,并使用Docker在本地环境中运行这些应用。