了解以及区分物理机,虚拟机(hypervisor/VMM) 和 容器(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。单纯使用qemu,采用的就是完全的虚拟化模式。Guest OS认为自己和硬件直接大交道,其实都是和qemu模拟出来的硬件打交道。qemu会将这些指令转译给真正的硬件。由于所有的指令都要从qemu里面过一手,所以性能就会比较差。当CPU硬件标志位在BIOS里面开启后,就会开启硬件辅助的完全虚拟化。此时,通过KVM, Guest OS的CPU指令就不用了再经过qemu的转译了,直接运行,大大提过了速度。
在这里插入图片描述

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虚拟化会由其他技术完成。

在这里插入图片描述
那么,既然type 2型的hypervisor是运行在宿主系统上的一个模拟硬件资源以及调度的软件。那么为什么还要有host OS呢?于是type 1型的虚拟化技术满足了这个愿望。在type 1型的虚拟机中,hypervisor既是操作系统也是虚拟化软件,这种技术的有点事效率高,虚拟机安全性只依赖于VMM。

在这里插入图片描述
在这里插入图片描述

docker技术

docker,和VMM不一样。docker依赖于宿主的操作系统(host OS)。也就是说,docker容器要运行在host OS上。他通过一系列技术手段实现了各种隔离,比如内存隔离,存储隔离,CPU隔离。docker不支持windows内核,因此他不能使用在windows上。既是现在有windows版本的docker,也是运行在windows上的linux虚拟机上。由于docker不需要去创建hypervisor层,因此和传统的VM相比较,docker有很多优点。4

在这里插入图片描述
支撑docker的核心技术有三个:Namespace,Cgroup,UnionFS。Namespace提供了虚拟层面的隔离,比如文件隔离,网络隔离等等。Croup提供了物理资源的隔离,比如CPU,内存,磁盘等等。UnionFS给docker镜像提供了技术支撑。

传统计算机体系结构

在这里插入图片描述

  • ISA:Instruction Set Architecture。指令集,这是操作系统与硬件之间的一层。硬件提供了一层接口给操作系统进行调用。指令集中包含了数据处理,存储操作,算术逻辑单元,控制流等。X86架构采用的是复杂指令集;ARM架构采用的是精简指令集。而这些指令集只有在ring 0(内核态)模式下才能使用。
  • ABI:Application binary interface。应用二进制接口。
  • API:Application programming interface。应用编程接口。

虚拟机和Docker的区别

从一台物理机可以虚拟化出很多的虚拟机,一定程度上实现了资源使用的灵活性。但是,虚拟化的方式其实还是非常的复杂。虚拟机虽然是虚拟的,但是他也用有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的内核的,应用运行在客户机的用户态。
在这里插入图片描述

参考资料


  1. 物理机、虚拟机、容器的比较 ↩︎

  2. 虚拟机:如何成立子公司,让公司变集团 ↩︎

  3. 汽车hypervisor — 定义和类型 ↩︎

  4. 容器和虚拟机 ↩︎

  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值