谈到云计算虚拟化,容器技术是重中之重。容器在云原生开发中占据了核心位置,人们经常拿它和虚拟机相比较,来理解容器有哪些独特的特性以及它和传统的虚拟化技术有何异同。今天我们就从容器和虚拟机对比的视角切入,来了解下容器。
虚拟机
首先,我们来看看什么是虚拟化和虚拟机,以及它是怎样实现的。
虚拟化本质上是一套软件程序,用于实现硬件层面的资源隔离,把物理上一套计算机硬件资源,在逻辑上映射成多套相互隔离的虚拟资源,从而实现计算、存储、网络硬件资源的虚拟化。这套实现资源虚拟化的软件程序就叫做“Hypervisor”, 它本身也跑在硬件资源上,占用少量开销,但Hypervisor实现了一套物理资源到多套虚拟资源的映射和管理。
在Hypervisor上层,每一套虚拟资源被用来创建一个客体操作系统(Guest OS),多套客体操作系统并行不悖的跑在Hypervisor层之上,下层是同一套物理硬件资源以及对应的物理机操作系统(Host OS)。
而一套被隔离独立出来的虚拟化硬件资源加上客体操作系统就构成了我们通常所说的一个虚拟机。Guest OS的登录权限交付给用户后,终端用户登录Guest OS使用虚拟机的体验和平时使用真实物理主机操作系统的体验完全一致,也可以部署任何他们想要安装的程序。
视乎虚拟化编排,我们可以让多个虚拟机跑在同一台物理机之上,而Hypervisor就是联通上下虚实,负责虚拟机之间对底层资源的切分和隔离,实现此架构的作业平台。
容器
说完了虚拟机,我们再来看看什么是容器。相较于虚拟机,容器(容器化)是一种更轻量、更敏捷的虚拟化实现方式,我们把它叫做“操作系统虚拟化”。它不需要用到Hypervisor,也没有跑在Hypervisor上“臃肿”的客体操作系统(Guest OS),因此容器的部署效率得到了很大的提升。
每个容器里,只含有所必需的独立微服务及其依赖的运行时环境库文件,这使得容器变得非常轻量和具备极强的可移植性,可以非常方便的进行跨平台部署。
那么容器运行的时候又是如何隔离底层资源的呢?严格地说,容器并没有实现对底层物理资源进行直接的“分割”和“隔离”管理,而是利用了操作系统的功能特性,在物理机操作系统(Host OS)层面通过进程权限进行管理来实现不同进程在CPU、内存和磁盘等物理资源上的访问权限控制。这些进程的权限,又会关联到每个容器的根用户权限,从而实现不同容器的根用户对未经授权的资源不能随意访问。
虚拟机和容器的区别
我们来简单总结一下虚拟机和容器的区别。在传统的虚拟化中,我们使用Hypervisor来虚拟化底层物理硬件资源。每一台虚拟机会包含有一套客体操作系统(Guest OS)跑在虚拟化出来的物理资源之上,终端用户可以登录这套客体操作系统(Guest OS)从而实现对虚拟机的控制和使用。多台虚拟机可以并行不悖的跑在同一台物理机上,并且这些虚拟机操作系统可以各不相同(如Linux、Windows等);相较于虚拟机虚拟化对象是底层硬件,容器虚拟化的对象是操作系统,因此容器中只需要包含应用以及库文件依赖,不需要像虚拟机一样包含一套操作系统。
因此容器更小、更快、可移植性更强,它“寄生”在物理机操作系统上,直接利用它管理的资源和功能特性。和虚拟机一样,容器也允许开发者优化物理资源的利用率,除此之外,因为容器采用微服务架构,这使得它天然地在应用部署的颗粒度和可伸缩性上更具灵活高效的优势。
容器的灵活性和可移植性优势使得它非常完美地契合了混合云部署的需要。当开发者开发应用的时候,我们很难去精确的规划和预测此应用将会被部署在什么样的环境上,并且随着业务发展的需要,可能今天部署在私有云环境上的应用,隔天就有需求要迁移到公有云上;又或者因为各种各样的原因,应用需要从一朵公有云迁移到其他的公有云环境上。容器和微服务架构使得我们开发和运维团队手中掌握了更多的灵活性来处理和面对复杂的多环境业务部署需要。