虚拟机和容器的比较

虚拟化的发展历史

虚拟化(Virtualization)技术最早出现在 20 世纪 60 年代的 IBM 大型机系统,在70年代的 System 370 系列中逐渐流行起来,这些机器通过一种叫虚拟机监控器(Virtual Machine Monitor,VMM)的程序在物理硬件之上生成许多可以运行独立操作系统软件的虚拟机(Virtual Machine)实例。随着近年多核系统、集群、网格甚至云计算的广泛部署,虚拟化技术在商业应用上的优势日益体现,不仅降低了 IT 成本,而且还增强了系统安全性和可靠性,虚拟化的概念也逐渐深入到人们日常的工作与生活中。

虚拟化技术的分类

虚拟化技术主要分为以下几个大类 [1]:

平台虚拟化(Platform Virtualization),针对计算机和操作系统的虚拟化。

资源虚拟化(Resource Virtualization),针对特定的系统资源的虚拟化,比如内存、存储、网络资源等。

应用虚拟化(Application Virtualization),包括仿真、模拟、解释技术等。

平台虚拟化-虚拟机

我们通常所说的虚拟化主要是指平台虚拟化技术,通过使用控制程序(Control Program,也被称为 Virtual Machine Monitor 或 Hypervisor),隐藏特定计算平台的实际物理特性,为用户提供抽象的、统一的、模拟的计算环境(称为虚拟机)。虚拟机中运行的操作系统被称为客户机操作系统(Guest OS),运行虚拟机监控器的操作系统被称为主机操作系统(Host OS),当然某些虚拟机监控器可以脱离操作系统直接运行在硬件之上(如 VMWARE 的 ESX 产品)。运行虚拟机的真实系统我们称之为主机系统。

平台虚拟化技术又可以细分为如下几个子类:

全虚拟化(Full Virtualization)

全虚拟化是指虚拟机模拟了完整的底层硬件,包括处理器、物理内存、时钟、外设等,使得为原始硬件设计的操作系统或其它系统软件完全不做任何修改就可以在虚拟机中运行。操作系统与真实硬件之间的交互可以看成是通过一个预先规定的硬件接口进行的。全虚拟化 VMM 以完整模拟硬件的方式提供全部接口(同时还必须模拟特权指令的执行过程)。举例而言,x86 体系结构中,对于操作系统切换进程页表的操作,真实硬件通过提供一个特权 CR3 寄存器来实现该接口,操作系统只需执行 "mov pgtable,%%cr3" 汇编指令即可。全虚拟化 VMM 必须完整地模拟该接口执行的全过程。如果硬件不提供虚拟化的特殊支持,那么这个模拟过程将会十分复杂:一般而言,VMM 必须运行在最高优先级来完全控制主机系统,而 Guest OS 需要降级运行,从而不能执行特权操作。当 Guest OS 执行前面的特权汇编指令时,主机系统产生异常(General Protection Exception),执行控制权重新从 Guest OS 转到 VMM 手中。VMM 事先分配一个变量作为影子 CR3 寄存器给 Guest OS,将 pgtable 代表的客户机物理地址(Guest Physical Address)填入影子 CR3 寄存器,然后 VMM 还需要 pgtable 翻译成主机物理地址(Host Physical Address)并填入物理 CR3 寄存器,最后返回到 Guest OS中。随后 VMM 还将处理复杂的 Guest OS 缺页异常(Page Fault)。比较著名的全虚拟化 VMM 有 Microsoft Virtual PC、VMware Workstation、Sun Virtual Box、Parallels Desktop for Mac 和 QEMU。

超虚拟化(Paravirtualization)

这是一种修改 Guest OS 部分访问特权状态的代码以便直接与 VMM 交互的技术。在超虚拟化虚拟机中,部分硬件接口以软件的形式提供给客户机操作系统,这可以通过 Hypercall(VMM 提供给 Guest OS 的直接调用,与系统调用类似)的方式来提供。例如,Guest OS 把切换页表的代码修改为调用 Hypercall 来直接完成修改影子 CR3 寄存器和翻译地址的工作。由于不需要产生额外的异常和模拟部分硬件执行流程,超虚拟化可以大幅度提高性能,比较著名的 VMM 有 Denali、Xen

硬件辅助虚拟化(Hardware-Assisted Virtualization)

硬件辅助虚拟化是指借助硬件(主要是主机处理器)的支持来实现高效的全虚拟化。例如有了 Intel-VT 技术的支持,Guest OS 和 VMM 的执行环境自动地完全隔离开来,Guest OS 有自己的"全套寄存器",可以直接运行在最高级别。因此在上面的例子中,Guest OS 能够执行修改页表的汇编指令。Intel-VT 和 AMD-V 是目前 x86 体系结构上可用的两种硬件辅助虚拟化技术。

部分虚拟化(Partial Virtualization)

VMM 只模拟部分底层硬件,因此客户机操作系统不做修改是无法在虚拟机中运行的,其它程序可能也需要进行修改。在历史上,部分虚拟化是通往全虚拟化道路上的重要里程碑,最早出现在第一代的分时系统 CTSS 和 IBM M44/44X 实验性的分页系统中。

操作系统级虚拟化(Operating System Level Virtualization)

在传统操作系统中,所有用户的进程本质上是在同一个操作系统的实例中运行,因此内核或应用程序的缺陷可能影响到其它进程。操作系统级虚拟化是一种在服务器操作系统中使用的轻量级的虚拟化技术,内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程,不同实例中的进程完全不了解对方的存在。比较著名的有 Solaris Container [2],FreeBSD Jail 和 OpenVZ 等。

这种分类并不是绝对的,一个优秀的虚拟化软件往往融合了多项技术。例如 VMware Workstation 是一个著名的全虚拟化的 VMM,但是它使用了一种被称为动态二进制翻译的技术把对特权状态的访问转换成对影子状态的操作,从而避免了低效的 Trap-And-Emulate 的处理方式,这与超虚拟化相似,只不过超虚拟化是静态地修改程序代码。对于超虚拟化而言,如果能利用硬件特性,那么虚拟机的管理将会大大简化,同时还能保持较高的性能。

应用虚拟化-容器

在Linux容器技术(linux containers,LXC)的基础上,docker进一步优化了容器的使用体验

早期的 Docker代码实现是直接基于LXC的。自0.9版本开始, Docker开发了 lincon-tainer项目作为更广泛的容器驱动实现,从而替換掉了LXC的实现。

目前, Docker还积极推动成立了runC标准项目,并贡献给开放容器联盟,试图让容器的支持不再局限于 Linux操作系统,并且更安全、更开放、更且扩展性。

简单地讲,读者可以将Docler容器理解为一种轻量级的沙盒。每个容器内运行着一个应用,不同的容器相互隔离,容器之间也可以通过网络互相通信。

容器的创建和停止十分快速,几乎跟创建和终止原生应用一致;另外,容器自身对系统资源的额外需求也十分有限,远远低于传统的虚拟机

很多时候,可以直接把容器当做应用本身。

容器(docker)和虚拟机的比较

 

  • Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机(数分钟)要快得多;
  • Docker容器对系统资源需求很少,一台主机上可以同时运行数千个 Docker容器
  • Docker通过类似Git设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新
  • Docker通过 Dockerfile支持灵活的自动化创建和部署机制,以提高工作效率,并标准化流程

 

 

  • 虚拟机是在硬件层面实现虚拟化,需要有额外的虚拟机管理程序和虚拟机操作系统层

    虚拟机(VM)是将一台服务器转变为多台服务器的物理硬件的抽象。系统管理程序允许多个VM在单台计算机上运行。每个VM包含操作系统,应用程序,必要的二进制文件和库的完整副本-占用数十GB。VM也可能启动缓慢。

  • docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,因此更加轻量级

    容器是应用程序层的抽象,将代码和依赖项打包在一起。多个容器可以在同一台计算机上运行,​​并与其他容器共享OS内核,每个容器在用户空间中作为隔离的进程运行。容器占用的空间少于VM(容器映像的大小通常为几十MB),可以处理更多的应用程序

    容器在Linux上本地运行,并与其他容器共享主机的内核。它运行一个离散进程,不占用任何其他可执行文件更多的内存,从而使其轻巧。

    相比之下,虚拟机(VM)运行成熟的"guest"操作系统,并通过虚拟机管理程序虚拟访问主机资源。通常,VM会产生大量开销,超出了应用程序逻辑所消耗的开销。

 

容器和虚拟机在一起

一起使用的容器和VM在部署和管理应用程序时提供了很大的灵活性

 

posted @ 2020-06-25 17:58  jeancheng  阅读(889)  评论(0编辑  收藏  举报