虚拟机和容器是现代计算中常见的两种抽象形式,但它们之间存在显著的区别。我们来详细探讨一下。
服务器虚拟化
如今,许多企业倾向于将每台服务器专用于特定的任务或应用程序,因为不同的应用或程序可能不适合在同一系统中运行。然而,大多数服务器在运行计算任务时仅使用其整体处理能力的一小部分,无法充分利用服务器的处理能力。
虚拟化技术解决了这一问题,通过将多台服务器整合到一台服务器中,运行多个虚拟环境。每台虚拟机(VM)都有自己的操作系统(可以是不同的操作系统),可以在其上安装应用程序。
虚拟机的设计原理是彼此隔离,并且与虚拟主机隔离,这意味着一个应用程序中的安全问题不会影响在另一个虚拟机中运行的应用程序。同样,如果一个应用程序崩溃并需要重新启动服务器,可以只重新启动其所在的VM,而不影响其他VM的运行。不过,这种隔离偶尔也会被打破,这种现象称为VM逃逸。
虚拟化还增强了可扩展性,因为VM是可移植的。例如,如果两个应用程序在一个虚拟主机上的VM中运行,但其中一个需要更多资源,以至于两个VM不能再在同一主机上共存。
如果没有虚拟化,将一个应用程序移动到新服务器将是一项艰巨的任务。但由于VM是以计算机文件形式存在的,因此可以通过网络(甚至通过存储介质)轻松复制或移动到新的虚拟主机上。事实上,VMware的vMotion和微软的Live Migration等特性甚至允许在运行时将虚拟机移动到新的主机,以确保服务不中断。
此外,这对于灾难恢复也具有重要意义。如果发生灾难,虚拟机可以转移到辅助站点,且无需镜像主站点。基本上只需在辅助站点上准备足够数量的虚拟主机即可。
Hypervisor是一种运行在基础物理服务器和操作系统之间的中间软件层,允许多个操作系统和应用共享硬件(有时也称为虚拟机监视器)。这可以是“裸机”hypervisor(也称为Type 1 hypervisor),例如包含自己的OS内核并直接在物理服务器上运行的VMware ESXi,也可以是内置于操作系统中的hypervisor(也称为Type 2 hypervisor),例如在Windows Server和Windows 10上运行的Microsoft的Hyper-V。
IBM在20世纪60年代开发了第一个hypervisor,如今流行的hypervisor包括Hyper-V、ESXi、KVM和Nutanix AHV。
容器
与虚拟化不同,容器主机需要运行自己的操作系统以及容器系统。
容器由单个应用程序(或微服务)以及运行所需的其他重要文件组成,利用容器主机的操作系统内核、二进制文件和库来运行。这些共享文件以只读方式提供给容器。在容器主机上运行的其他容器也共享主机的内核、二进制文件和库。
由于容器比虚拟机“轻”得多,并且启动速度也快得多,这使得它们成为运行微服务的理想工具。当对微服务的需求扩大时,可以启用容器,当需求减少时可以删除。它们也可以在公有云和私有云以及传统数据中心之间轻松移动。
目前最受欢迎的容器环境是Docker,其他还有rkt,Apache Mesos,lxc,containerd, Hyper-V Containers, and Windows Server Containers。
诸如Red Hat的Fedora CoreOS之类的专用操作系统是专门为安全、大规模地运行容器化工作负载而构建的。
虚拟机与容器
由于多个容器之间使用的还是同一个宿主机的操作系统内核,因此导致了容器与虚拟机之间存在一些重要区别:
容器比虚拟机小得多或“轻”得多,通常由几兆字节组成,并且所需的硬件资源也少得多。这意味着一台物理服务器可以承载的容器比虚拟机要多得多。容器可以在几秒甚至几毫秒内启动。相比之下,虚拟机的启动时间较长。由于容器都共享其主机的操作系统,因此所有应用程序都必须在同一操作系统上运行。相比之下,运行在虚拟主机上的虚拟机可以运行不同的操作系统(例如Linux,Unix和Windows)。使用容器时,只需要对容器主机的操作系统进行补丁和更新。而虚拟机则需对每个操作系统都进行补丁和更新。如果一个容器导致容器主机的操作系统崩溃,则在该主机上运行的所有容器都将失败。容器主机的操作系统内核中的安全漏洞将影响其所托管的所有容器。
虚拟机和容器的使用场景
虚拟机非常适合传统的资源密集型单片应用程序,尤其是准备将这些应用程序移至云中时。
容器更适合承载Web服务中使用的微服务,特别是在对可扩展性要求很高的情况下。当以这种方式使用容器时,通常由容器编排系统对其进行管理,以自动执行计算机应用程序的部署、扩展和管理。这些通常基于Kubernetes,Kubernetes是最初由Google设计但现在由云原生计算基金会维护的开源系统。
不仅如此,容器和虚拟机也可以共存,容器可以在虚拟机中运行,企业可以利用现有的虚拟化基础设施(例如虚拟机管理系统)来管理其容器。