了解以及区分物理机,虚拟机(hypervisor/VMM) 和 容器(Docker)的适用场景

article/2025/10/29 14:48:14

了解以及区分物理机,虚拟机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。单纯使用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. 容器和虚拟机 ↩︎


http://chatgpt.dhexx.cn/article/RPEoD1JR.shtml

相关文章

虚拟化与hypervisor

文章目录 虚拟化HypervisorHypervisor分类Hypervisor优点Container vs HypervisorHypervisorContainer 虚拟化 虚拟化通过将公司的物理资源视为可以动态分配虚拟资源的池,从而提高了IT资源的利用率。 虚拟化涉及从物理思维到逻辑思维的转变,将IT资源视…

Hypervisor 简介

单词解释 Hypervisor:超级监督者,管理程序 虚拟化技术 概念 一种运行在基础物理服务器和操作系统之间的中间软件层,可以访问服务器上包括磁盘和内存在内的所有物理设备。Hypervisor协调着这些硬件资源的访问,以及各个虚拟机之间…

Hypervisor技术

KVM介绍 KVM内置于Linux,是内核模块;KVM可以直接利用Linux来做一些在xen中需要利用hypervisor来做的事情,比如任务调度,内存管理等等。所以相比之下,KVM更轻量,更易管理,并且版本更新也可以随着…

hypervisor详解

hypervisor:一种运行在物理服务器和操作系统之间的中间层软件,可以允许多个操作系统和应用共享一套基础物理硬件。可以将hypervisor看做是虚拟环境中的“元”操作系统,可以协调访问服务器上的所有物理设备和虚拟机,所以又称为虚拟…

Hypervisor简介

从头开始了解和使用Hypervisor(第4部分) - 嘶吼 RoarTalk – 回归最本质的信息安全,互联网安全新媒体,4hou.com 根据 Hypervisor 的不同类型,我们将虚拟化分为I 型和 II 型两种。 I 型虚拟化,也被称为裸金属虚拟化,Hy…

什么是Hypervisor

根据维基百科:“Hypervisor 或者virtual machine monitor (VMM)是创造并且运行虚拟机的软件、固件、或者硬件”。 通俗来讲,Hypervisor是一种将操作系统与硬件抽象分离的方法,以达到host machine的硬件能同时运行一个至多个虚拟机作为guest …

虚拟化技术介绍 hypervisor简介

什么是虚拟化? 虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障…

Hypervisor

1 什么是Hypervisor? Hypervisor是一种系统软件,它充当计算机硬件和虚拟机之间的中介,负责有效地分配和利用由各个虚拟机使用的硬件资源,这些虚拟机在物理主机上单独工作,因此,Hypervisor也称为虚拟机管理…

2020-12-01 剖析 Linux hypervisor

hypervisor:一种运行在物理服务器和操作系统之间的中间层软件,可以允许多个操作系统和应用共享一套基础物理硬件。可以将hypervisor看做是虚拟环境中的“元”操作系统,可以协调访问服务器上的所有物理设备和虚拟机,所以又称为虚拟…

Hypervisor定义、种类及产品介绍

Hypervisor 是一种运行在物理服务器和操作系统之间的中间软件层(可以是软件程序,也可以是固件程序),Hypervisor 分两种,一种是直接运行在硬件设备上的;另一种是运行在具有虚拟化功能的操作系统上的。 Hyper…

剖析 Linux hypervisor KVM

Linux 的最重要创新之一就是转变为hypervisor(或运行其他操作系统的操作系统)。现在涌现许多使用 Linux 作为内核的 hypervisor 解决方案。本文探索 hypervisor 背后的原理,以及两个使用 Linux 作为平台的 hypervisor(KVM 和 Lguest)。 hypervisor 之于操作系统类似于操作…

Hypervisor介绍

一、单词释义: Hypervisor:超级监督者,管理程序; 二、虚拟化技术: 1.概念: 运行在基础物理服务器和操作系统之间的中间软件层,可以访问服务器上包括磁盘和内存在内的所有物理设备。Hypervis…

趣味俄罗斯方块代码分享(C语言)

趣味俄罗斯方块代码分享(C语言) 代码源自明日科技编著的《C语言项目开发|实战入门》,书中是使用Dev c/Visual C6.0编写,我是将代码在VC2019中重新编写,部分地方有修改。 操作系统:win 10 编译软件&#x…

【c语言小项目】基于easyX的俄罗斯方块

EeayX是针对 C/C 的简单图形库插件,本项目基于easyX游戏框架下实现俄罗斯方块游戏。 俄罗斯方块功能实现中主要运用了二维数组的循环遍历。能够实现基本功能,暂未实现旋转 c语言系列专栏:c语言之路重点知识整合 更多【c语言】小项目&…

c语言俄罗斯方块程序设计论文,c语言俄罗斯方块游戏程序设计报告

c语言俄罗斯方块游戏程序设计报告 俄罗斯方块程序设计报告 2018-7-1511 计本(2)班 卢文俊C 语言课程设计报告主标题: C 语言课程设计 副标题: 俄罗斯方块游戏 ----界面设计姓 名: 卢文俊 指导教师: 刘慧 院 系: 信息工…

【C语言程序设计】开源俄罗斯方块的代码的改进以及分析

实验二 数据类型运算符与表达式 实验三 选择结构程序设计 实验四 循环结构序设计 实验五 数组和字符串 实验六 函数 实验七 指针 实验八 结构体与文件读写 结课实验 俄罗斯方块小游戏 目录 前言 核心代码解析 1.定位程序 2.页面设计 3.文本读写 4.隐藏光标 结语 前言 这…

俄罗斯方块—C语言

思路: 1.初始化界面,用一个矩阵来保存界面的每一个位置,包括颜色跟数值,数值用来区分是墙还是方块还是空格,便于运行时的判断。 2.初始化方块,用4*4矩阵保存,1表示方块,0表示空格。…

俄罗斯方块c语言代码及注释,C语言代码实现俄罗斯方块

这里为大家敲写一段怎样用C语言实现俄罗斯方块: 首先推荐大家使用CodeBlocks这个软件,方便添加不同的工程。 代码中有很多注释便于理解! 下面是效果图和全部的代码以及注释,大家可以观看并自己新增内容! 1、首先是main.c文件: #include #include #include "game.h…

【C语言】百行代码实现—俄罗斯方块

文章目录 自述整体框架和流程开始游戏页面设计游戏设计流程介绍 注意可执行源码-全部 自述 这个代码是19年的末尾写的,最近就想着想把这个用博客分享出来,一方面是为了巩固自己的知识,另一方面也希望同学们能够因为这篇文章有所收获&#xf…

两张图片告诉你 载波聚合为4G加速的原因

描述 2015年被业界认为是LTE-A的规模商用元年,说到底,是载波聚合的规模商用。载波聚合作为LTE-A的关键技术之一,通过将两个或两个以上的载波(Component Carrier,CC)汇聚在一起,从而将分散的频谱…