了解以及区分物理机,虚拟机(hypervisor/VMM) 和 容器(Docker)的适用场景 | 您所在的位置:网站首页 › 虚拟机监视器 › 了解以及区分物理机,虚拟机(hypervisor/VMM) 和 容器(Docker)的适用场景 |
了解以及区分物理机,虚拟机hypervisor/VMM 和 容器Docker的适用场景
Abbreviations物理机和虚拟机以及容器的区别动机motivation:为什么要有虚拟机物理机:虚拟机容器
虚拟机的种类以及他们的本质区别虚拟化方式虚拟机类型docker技术传统计算机体系结构虚拟机和Docker的区别
Abbreviations
VMM: virtual machine monitor Hypervisor: 也可以叫做 VMM 物理机和虚拟机以及容器的区别 动机motivation:为什么要有虚拟机一句话,就是:现在物理CPU,物理内存和存储,物理网络的硬件能力都越来越强大了。面对现在越来越多样化的业务需求,我们要更加灵活地,更加高效的使用我们的硬件资源。以达到,高效 和 低成本 的两个目的。 如果都是直接使用物理机的话,就会有面向业务的资源大小分配不灵活,硬件的申请采购不灵活,硬件资源复用不灵活。我们总是希望把硬件资源抽象成软件资源,来动态的业务按需分配和使用。以达到 高效 和 低成本 的目标。 下面的三幅图,是我从另外一篇文章中看到的1。非常生动的以我们居住的别墅,公寓和胶囊公寓来对应物理机,虚拟机已经容器对于资源高效且低成本的使用和复用。非常的生动形象。 物理机:这种方式是从虚拟机的内核角度来看的2。 完全虚拟化方式,我们可以翻译成 完全欺骗方式。欺骗谁。。。欺骗虚拟机的内核。在硬件上的操作系统来看,虚拟机是一个普通的应用。只能运行在用户态。可是从代码的角度来看,虚拟机的内核,我就是内核应该运行在内核态。比如当虚拟机里面的浏览器要访问网络的时候,向虚拟机内核请求网络访问。虚拟机内核就要去操作网卡。但是此时,虚拟机是运行在用户态的,并没有权限直接访问网卡。于是,虚拟机的内核分裂了。。。到底我还是不是内核 怎么办呢?这个时候,就需要一个虚拟化层,虚拟化软件。去模拟假的CPU,内存,网络和硬盘给虚拟机的内核,让它自我感觉良好,终于又像一个内核了。这种,情况下,虚拟机内核认为自己就是内核是被虚拟化层完全欺骗的。 流程是这样的:应用请求 -> 虚拟机的内核 ->虚拟网络硬件 -> 虚拟化软件 -> 物理机内核 -> 物理网络硬件 响应的顺序反过来就是了。对于物理硬件的操作,都是需要如虚拟软件模拟虚拟的硬件,其实什么事情都是要虚拟化软件转诉一遍给物理内核的。虚拟机的内核根本不知道这些。这种处理方式的一个坏处就是:慢。 于是,对于物理CPU资源的申请加速方案,有了 硬件辅助的完全虚拟化方式。这种方式需要Intel的VT-x和AMD的AMD-V从硬件层面来支持。对于虚拟机内核来讲,只要将标志位设为虚拟机状态,虚拟机内核就可以直接在物理CPU上执行大部分的指令。不再需要虚拟化软件在中间转述,除非遇到非常特别的指令,才需要将标志位设为物理机内核态运行,这样大大提高了效率。所以,安装虚拟机的时候,我们务必将物理CPU的这个标志打开。想知道是否打开,对于intel,可以使用 grep “vmx” /proc/cpuinfo; 对于 AMD,可以使用 grep “svm” /proc/cpuinfo 来查看。 另外就是访问网络或是硬盘等外设的时候,为了取得加速。也需要让虚拟机内核加载特殊的驱动。理解起来就是,不再欺骗虚拟机内核。要让他清楚自己的地位,他不是真正的物理机内核。这种 加速的方式加做 半虚拟化方式。 qemu和kvm整合之后,CPU的性能问题解决了。接下来,qemu还会模拟其他的硬件,如网络和硬盘。全虚拟化的方式也会影响这些设备的性能。于是,qemu在采取半虚拟化的方式,让Guest OS 加载特殊的驱动来做这些事情。例如,网络需要加载virtio_net, 存储需要加载virtio_blk. Guest 需要安装这些半虚拟化驱动,此时Guest OS知道自己是虚拟机了。所以,数据会直接发给半虚拟化设备,经过特殊的处理(例如排队,缓存,批量处理等性能优化方式),最终发给真正的硬件。从而提高了外设的访问处理性能。 虚拟机类型Hypervisor有type 1 和 type 2的区别。3 如果hypervisor运行在host OS上,那么就是type 2.他的处理方式是不与物理层接触,因此也被称为hosted hypervisor。他会提供模拟出来的物理层资源给上方的guest OS使用。在云计算中,通常情况hypervisor(kvm技术)只是负责CPU和内存的虚拟化,I/O虚拟化会由其他技术完成。
docker,和VMM不一样。docker依赖于宿主的操作系统(host OS)。也就是说,docker容器要运行在host OS上。他通过一系列技术手段实现了各种隔离,比如内存隔离,存储隔离,CPU隔离。docker不支持windows内核,因此他不能使用在windows上。既是现在有windows版本的docker,也是运行在windows上的linux虚拟机上。由于docker不需要去创建hypervisor层,因此和传统的VM相比较,docker有很多优点。4
从一台物理机可以虚拟化出很多的虚拟机,一定程度上实现了资源使用的灵活性。但是,虚拟化的方式其实还是非常的复杂。虚拟机虽然是虚拟的,但是他也用有Guest OS,并且需要由VMM负责CPU,内存,网络,存储全部都虚拟化。一个都不能偷懒。 于是,linux中的容器container技术提供了一种更加灵活地方式。既可以隔离出一部分资源,专门用于某个进程,又不需要费劲周折的虚拟化这么多的硬件。毕竟,我只是想跑一个程序,而不是要一整个的linux系统。其实,容器就像船上的不同集装箱封装着不同的货物。封装带来了好处,一个是打包,二是标准化。 容器实现封闭的环境主要靠两种技术。 使容器看起来是隔离:namespace(命名空间)。每个命名空间中的应用看到的,都是不同的IP地址,用户空间,进程ID等。使容器用起来是隔离的技术:cgroup(资源限制),即明明整台机器有很多的CPU,内存,但是一个应用智能使用其中的一部分。除了封装,还有第三个技术:UnionFS, 提供了镜像的技术支撑。在封装好的那一刻,集装箱里那一刻的状态都被保存成一系列文件,无论在哪里运行这个镜像,都能完成的还原但是的情况。从下面虚拟机和Docker的体系结构图中我们可以看到差别。Docker结构图中的Docker Engineer 替代了 Hypervisor 和 Guest OS。
如下图实例所示,通过Docker run命令将容器镜像运行为容器,通过namespace和cgroup进行隔离。容器里面不包含内核,是共享host OS的内核。对比虚拟机,虚拟机在qemu进程里面是有客户机guest OS的内核的,应用运行在客户机的用户态。 参考资料: 物理机、虚拟机、容器的比较 ↩︎ 虚拟机:如何成立子公司,让公司变集团 ↩︎ 汽车hypervisor — 定义和类型 ↩︎ 容器和虚拟机 ↩︎ |
CopyRight 2018-2019 实验室设备网 版权所有 |