VM VS Container
参考 VMware 虚拟化的四大特点
零、虚拟化技术四大特点
1.封装:虚拟机都保存在文件中,且可通过移动跟复制这些文件的方式来移动跟复制该虚拟机。
2.相对于硬件独立:无需修改即可在任何服务器上运行虚拟机。
3.隔离:在同一服务器上的虚拟机之间互相隔离,改变了之前单台物理机服务器只能挂以个应用的格局。即在一个物理服务器上可以同时运行N个操作系统,每个系统中部署以个应用,这些应用可同时链接N个小时开启,且系统间互相隔离,互不影响,合理利用了服务器的硬件资源。
4.分区:在单个物理服务器上同时运行多个虚拟机,将一个物理服务器的硬件资源分别分区给多个虚拟机。
一、VM - 虚拟化技术
参考Docker系列开篇之Virtual Machine VS Container(一) - Jeffcky - 博客园 (cnblogs.com)
虚拟机包含虚拟硬件、内核、用户空间
虚拟系统通过生成现有操作系统的全新虚拟镜像,它具有真实windows系统完全一样的功能,它可以独立安装运行软件,保存数据,拥有自己的独立桌面,不会对真正的系统产生任何影响 。
虚拟机借用Hypervisor(虚拟机监视器VMM)在物理机器上运行,Hypervisor是一种运行在基础物理服务器和操作系统之间的中间软件层,用来建立与执行虚拟机的软件、固件或硬件。
二、Container - 容器技术
虚拟化技术已经成为一种被大家广泛认可的服务器资源共享方式,它可以在按需构建操作系统实例的过程当中为系统管理员提供极大的灵活性。由于hypervisor虚拟化技术仍然存在一些性能和资源使用效率方面的问题,因此出现了一种称为容器(Container)的新型虚拟化技术来帮助解决这些问题。
起初,大家普遍认为基于hypervisor的方式可以在最大程度上提供灵活性。所有虚拟机实例都能够运行任何其所支持的操作系统,而不受其他实例的影响。然而,越来越多的用户发现hypervisor提供这样一种广泛支持的特性其实是在给自己制造麻烦。对于hypervisor环境来说,每个虚拟机实例都需要运行客户端操作系统的完整副本以及其中包含的大量应用程序。从实际运行的角度来说,由此产生的沉重负载将会影响其工作效率及性能表现。
首先,每种操作系统和应用程序堆栈都需要使用DRAM。对于多个运行简单应用程序的小型虚拟机实例来说,这种方式可能产生很大的系统开销,降低性能表现。加载并卸载这些堆栈镜像需要花费很长时间,并且还会增加容器技术服务器的网络连接数量。对于极端情况来说,如果用户在上午9点同时启动上千台虚拟桌面,还有可能导致网络风暴的发生。
部署虚拟服务器的目的之一在于快速创建新的虚拟机实例。然而从网络存储当中复制镜像需要花费大量时间,这些操作会延长启动过程,无疑会限制系统灵活性。
因此我们可以选择使用容器技术。只需要通过简单的观察我们便能够发现容器技术的出现是为了解决多操作系统/应用程序堆栈的问题:
- 在单台服务器当中为所有虚拟机实例使用相同的操作系统对于大部分数据中心来说都不算是真正的限制。流程管理(Orchestration)可以轻松处理这种变化
- 许多应用程序堆栈都是相同的(如LAMP)
- 对于大规模集群来说,在本地硬盘当中存储操作系统副本将会使得更新过程变得更为复杂
容器技术: 有效的将单个操作系统的资源划分到孤立的组中,以便更好的在孤立的组之间平衡有冲突的资源使用需求,这种技术就是容器技术。
与虚拟化硬件的虚拟机不同的是,容器通过抽象用户空间来提供操作系统级虚拟化,如下图
如上图仅仅只打包用户空间而不包含内核和虚拟硬件,每个容器都有属于自己的独立用户空间,以此来允许多个容器运行在单个主机上,也就是网上很多资料所提及的容器进一步封装了linux,占用资源少。同时我们也可以看到所有操作系统级的体系结构都在容器之间共享,这也就是网上很多资料所提及的容器轻巧的原因。
三、共同点
容器技术和虚拟机技术是对计算机不同层面的抽象,容器技术(docker等)是对资源(用户空间)的抽象(docker是集装箱,用来存储资源,而货轮是底层的软硬件,用来加载这些资源);而虚拟机技术是对虚拟硬件,内核和用户空间的抽象(基于Hypervisor虚拟机监控器)。
linux中可以安装docker,运行docker容器;也可以在docker容器中部署ubuntu环境(ubuntu虚拟机中的资源是用文件保存的,因此可以用容器技术来加载ubuntu的文件资源)
容器和虚拟机的作用相似:都是将应用程序及其依赖隔离到可以在任何地方运行的独立单元,同时二者都消除了对物理硬件的需求,能更有效的使用计算机资源。