1.2 了解容器化技术
微服务架构的应用在本质上是一个分布式系统。分布式系统相关的技术早在微服务架构出现之前就已经存在并应用在生产环境中。在部署和运行分布式系统时,一个最基础的问题是如何准备和管理计算资源。
从发展的角度来说,对计算资源的管理方式经过了图1-3中给出的发展过程。
·图1-3 计算资源的管理
在早期的时候,应用直接安装在操作系统中。在进行扩展时,需要首先准备新的物理机器,接着安装操作系统,最后再安装应用。这种方式的问题在于多个应用共享物理资源,一个应用可能占用过多的资源,从而影响其他应用的性能。如果单个应用独占一台主机,则无法充分地利用资源。除了应用之外,操作系统自身也占用了大量的资源。这种方式进行扩展时的速度很慢,只能从物理机器开始,无法快速地响应业务的需求。
硬件虚拟化技术的出现提供了新的解决方案。硬件虚拟化指的是对计算机的虚拟化。虚拟化对用户隐藏了计算平台的物理特征,提供一个抽象的计算平台。控制虚拟化的程序称为Hy-pervisor。Hypervisor负责创建和运行虚拟机。在虚拟机之上可以安装不同类型的操作系统,包括Windows、Linux和macOS。所有的虚拟机实例共享虚拟化的硬件资源。
硬件虚拟化使得我们可以更充分地利用硬件资源。在创建集群时,用少数的大型服务器替换掉数量较多的小型服务器。在这些服务器上运行Hypervisor,并根据需要创建和运行虚拟机。虚拟机上运行操作系统,而应用运行在操作系统上。在创建虚拟机时可以限制虚拟机的CPU、内存和硬盘等资源。硬件虚拟化可以更好地支持应用的扩展。Hypervisor可以从镜像文件中快速创建出虚拟机实例。当应用运行时出现错误时,只需要创建新的虚拟机实例替换掉出错的实例即可,使得故障可以快速恢复。一种常见的部署方式是创建出应用对应的虚拟机镜像文件,作为应用部署的基础。
硬件虚拟化的不足之处在于只能以操作系统为单位来进行扩展。操作系统本身也需要占用资源。当虚拟机的数量增加时,很多资源实际上都被虚拟机中的操作系统占用。操作系统级别的虚拟化(也就是容器化)可以在隔离的容器中运行程序。容器中运行的程序只能访问操作系统的部分资源,包括CPU、内存、文件系统和网络等。目前流行的容器化实现包括Docker、CRI-O和containerd等[3]。
在众多容器化技术中,Docker是最流行的技术之一。Docker采用客户端-服务器的架构。服务器端是Docker后台程序,负责构建、运行和分发容器;Docker客户端通过API与Docker后台程序交互。
Docker中两个最重要的概念是镜像(Image)和容器(Container)。镜像是创建容器的只读模板。镜像可以从注册中心下载,也可以是创建的自定义镜像。Docker Hub是默认的镜像注册中心,包含了非常多可用的镜像。企业内部也可以搭建自己私有的注册中心。镜像虽然是不可变的,但是可以在已有的镜像上进行定制,得到新的镜像。这也是通常创建镜像的方式。容器是镜像的可运行实例。从镜像中创建出来的容器可以被启动、暂停、停止和删除。
限于篇幅,本节不对Docker的具体实现进行介绍,感兴趣的读者请参考其他的资料。