虚拟化与容器

虚拟机与容器隔离边界对比图

在过去,企业部署服务的标准规则是:“一台物理服务器只跑一个应用”。比如,一台服务器跑官网,另一台跑数据库。这种“一机一应用”的传统模式存在极大的缺陷:

  • 成本高昂:采购、架设和维护大量物理服务器需要巨大的资金支持。
  • 硬件闲置严重:大多数应用的负载并不均匀。很多物理服务器的 CPU 和内存利用率常年徘徊在 5% 到 20% 之间,剩余的算力全被白白浪费。
  • 部署扩容极慢:采购一台新的服务器并上架组网通常需要几天甚至几周的时间。

虚拟化技术正是为了打破物理硬件的硬边界、提高资源利用率而诞生的。

虚拟机

我们可以用“写字楼”来理解虚拟机(VM)的工作原理:

  • 物理服务器:相当于一整栋 10 层的写字楼。如果一家刚创业的小微公司把整栋楼全租下来,不仅极其昂贵,大部分楼层还会空置。
  • 虚拟机:通过虚拟机管理软件,将写字楼隔断成一间间独立的“独立办公室”。每个办公室都有独立的防盗门、电源插座和办公网线。对于在里面办公的公司(虚拟机里的操作系统)而言,它们觉得拥有一个完全属于自己的专属办公空间,感知不到邻居的存在。
  • 虚拟机管理程序:扮演写字楼的“物业总管”。它是实现虚拟化的核心软件,负责将物理机的 CPU、内存和硬盘资源精准切分成多份,分发给各个虚拟机,并保证它们之间相互隔离、生命周期互不干扰。

虚拟机管理程序

根据运行的位置,Hypervisor 可以划分为两种类型:

  • Type 1(裸机型):直接运行在物理硬件之上,其自身就具备操作系统的底层管理功能。它的运行效率极高,几乎没有中间层性能折损,广泛应用于云厂商的数据中心和企业生产环境(如 VMware ESXi、Proxmox VE)。
  • Type 2(寄宿型):安装在已有的宿主操作系统(如 Windows 11)之上,作为一个普通的应用程序运行。它的运行效率稍低,但安装简便,适合个人测试、安全实验和运行 Kali Linux 等场景(如 Oracle VirtualBox、VMware Workstation)。

虚拟机管理程序(Hypervisor)类型选择

练习

根据典型用例,假设你需要在一台已经运行了 Windows 操作系统的个人笔记本电脑上安装 Kali Linux 虚拟机来进行网络安全学习与渗透测试,你应该选择哪种类型的虚拟机管理程序(Hypervisor)? A. Type 1(裸机型,直接运行在物理硬件上) B. Type 2(寄宿型,运行在现有操作系统上) 请提交正确选项的字母(例如 A)。

提交答案

题解 Hint

容器

虽然虚拟机实现了良好的隔离,但它的代价也是明显的:每个虚拟机都必须运行一个完整的操作系统,这导致 VM 会白白占用大量的 CPU 和内存资源,且启动耗时较长。

容器技术则更进一步。

如果说虚拟机是“写字楼里隔断出的专属办公室”,那么容器就是“联合办公空间里租用的公共办公桌”。

容器省略了独立的操作系统,直接共享宿主操作系统的内核。它只打包应用本身以及运行该应用所必需的代码库与依赖文件。

  • 轻量与高速:由于不需要加载操作系统内核,容器可以在几毫秒内瞬间启动,且占用的内存极小。
  • 高度一致性:开发人员可以通过 Docker 等工具将程序和所有依赖打包成一个标准模板,称为容器镜像

    镜像与容器的关系,非常类似于“月饼模具”与“月饼实体”。镜像是一个只读的模板,打包好了所有的原料和配方;而容器则是用这个模具压制出来的、可以拿来吃(运行)的月饼。你可以用同一个模具瞬间压出几十个一模一样的月饼。 这确保了程序在任何环境下都能保持完全一致的运行表现,真正实现“在开发电脑上能跑,在服务器上也一定能跑”。

  • 系统类型限制:因为容器共享宿主内核,所以容器的类型必须与宿主操作系统相匹配(例如,不能直接在 Linux 物理机上运行原生 Windows 容器)。

警告

容器共享内核的代价:由于所有容器与宿主机共用同一个操作系统内核,其安全隔离边界比虚拟机更加脆弱。如果攻击者在某个容器内获取了最高权限,一旦宿主机的系统内核存在未修复的安全漏洞,攻击者就能通过特制的系统调用直接逃出容器,进而夺取整个物理宿主机的控制权。这种安全隐患被称为容器逃逸

现在,请通过下方的交互式沙箱演练,体验如何在虚拟化物理机资源池中按需开出并调度多台虚拟云服务器,直观感受虚拟化资源的切分与管理过程。

沙箱演练:在一台物理机上部署多台虚拟服务器

模拟实验

在右侧的虚拟化管理器模拟器中,你将看到一台物理服务器的资源池。请通过点击按钮,在这台物理机上陆续开出 3 台互相隔离的虚拟化云服务器(如博客服务、电商后台、数据分析环境),观察底层硬件资源(CPU、RAM)的切分与占用情况。成功运行 3 台服务器即可完成本项演练。

点击这里启动: