本节摘要:虚拟化是云计算的"魔法"——它让一台物理服务器分身成几十台独立机器。本节从"为什么要虚拟化"讲起,拆解硬件层虚拟化的原理,然后对比虚拟机(VM)、容器、无服务器(Serverless)三种隔离粒度的取舍:隔离强度、资源占用、启动速度各不相同。读完你就能理解,为什么云的弹性依赖虚拟化,以及"选择虚拟机还是容器"这道经典送命题该怎么解。
阅读完本节,你应当能够:
先算一笔账。一台 32 核、128GB 内存的物理服务器,如果只跑一个业务应用,资源的浪费肉眼可见——CPU 平时 5%,内存用不到一半。可如果直接在物理机上装多个应用,又会出现"一个应用崩了、全家跟着遭殃"的问题,还有版本冲突、端口冲突这些说不完的麻烦。
虚拟化解决的就是这个两难:把一台物理机切分成多个互相隔离的"虚拟电脑",每个都能装自己的操作系统、跑自己的应用,互不干扰。 这就是虚拟机监控器(Hypervisor)干的事——它是云厂商机房里的"房东",负责把一间大厂房隔成许多独立房间,每间房有独立的门锁和电路。
理解了虚拟机,容器和无服务器就顺理成章了:它们都是在"隔离"这条路上的演进——虚拟机隔离得太重,容器轻装上阵;容器还要你自己管理,无服务器干脆连管理也省了。三者不是互相替代,而是各自占据不同的取舍位置。
虚拟化(Virtualization)本质是"用软件模拟硬件,把一份物理资源切分成多份逻辑资源"。一个虚拟机就是一台被软件模拟出来的完整计算机:它有虚拟 CPU、虚拟内存、虚拟磁盘、虚拟网卡,里面装一个完整体面的操作系统(Guest OS)。多个虚拟机可以共存于同一台物理机,每个虚拟机以为自己在独占整台机器。
关键组件是 Hypervisor(虚拟机监控器)。它跑在物理硬件之上,负责:给每个虚拟机分配 CPU 时间片、管理内存地址映射、转发磁盘和网络请求。常见实现有 VMware、Hyper-V、KVM。Hypervisor 之上跑的是完整的客户操作系统,所以虚拟机的隔离性极强——一个虚拟机里的内核崩溃,几乎不会影响其他虚拟机。
容器(Container)走了另一条路:所有容器共享宿主机的操作系统内核,只隔离用户空间。 容器里不装操作系统,只打包"应用 + 运行依赖",由宿主机内核直接运行。因为省掉了一整层客户操作系统,容器的体积可以小到几十 MB,启动从"分钟级"变成"毫秒到秒级"。
这个差异带来一个连锁反应:因为共享内核,容器之间没有内核级隔离,一个容器里跑了 rm -rf / 级别的操作,理论上可能影响同宿主机的其他容器(取决于内核漏洞与权限配置);也因为共享内核,容器只能跑与宿主机兼容的操作系统内核,不能像虚拟机那样"一台机器里同时跑 Windows 和 Linux"。容器的典型管理平台是 Docker,编排平台是 Kubernetes(详见第 5.1 节)。
无服务器(Serverless)再把抽象往上推一层。它不直接给你一个"容器"或"虚拟机"让你管,而是让你提交代码/函数,平台按事件触发执行、执行完就回收资源。你既不碰物理机,也不碰操作系统,甚至不常意识到"实例"的存在。FaaS(函数即服务)是它的核心形态,典型产品是 AWS Lambda、Azure Functions、Google Cloud Functions。

无服务器的优势是"极致免运维 + 按执行计费":没请求时不花钱,有请求才拉起执行。代价是冷启动延迟、单函数超时限制、长连接与有状态应用不友好。第 5.2 节会展开讲。
| 维度 | 虚拟机 | 容器 | 无服务器 |
|---|---|---|---|
| 隔离性 | 强(独立内核) | 中(共享内核) | 中(平台隔离) |
| 资源占用 | 高 | 低 | 很低 |
| 启动速度 | 分钟级 | 秒级 | 毫秒~秒级 |
| 管理粒度 | 整机 | 应用包 | 函数 |
| 计费方式 | 按时租用 | 按资源/时长 | 按执行次数与时长 |
| 适用场景 | 强隔离、异构系统 | 微服务、CI/CD | 事件驱动、突发负载 |
⚠️ 常见坑:把"容器启动快"当成"容器一定比虚拟机安全"。容器共享内核,攻击面模型与虚拟机不同,对安全要求极高的负载要做额外的隔离加固(如 Kata、gVisor 这类沙箱容器)。
💡 关键直觉:选型本质是问"我要隔离到哪一层、愿意为隔离付多少成本"。隔离越深越安全越贵,隔离越浅越省资源越快——没有绝对最优,只有适合。
虚拟化是总纲,虚拟机/容器是无服务器的"基础设施";无服务器跑的函数,底层往往还是容器。三层是递进关系,不是三个平行选项:你的云厂商很可能在"虚拟机"上跑"容器"再对外提供"函数服务"。理解这一点,看云厂商的文档就不会被层出不穷的名词绕晕——它们只是把虚拟化这个老魔术换着花样演。
把三种隔离方式放进同一个真实业务里,选型逻辑会更清楚。假设你要做一个用户上传照片后自动加水印、压缩、生成缩略图的服务。
第一种思路:买几台虚拟机,装上图像处理软件,用户上传时通过消息队列把任务派给这些机器处理。优点是一切可控,缺点是流量不规律时——白天上传多、凌晨几乎为零——你得为"闲着也是闲着"的虚拟机持续付费,还要自己处理扩容。虚拟机适合"负载有规律、需要稳定长驻"的场景。
第二种思路:把处理逻辑写成 Docker 镜像,在容器集群里跑,流量上来时自动加容器副本。比虚拟机灵活,资源利用率高,但你还是得管一个容器集群——节点、镜像、调度策略,都是运维成本。容器适合"负载波动较大、团队愿意投入运维"的场景。
第三种思路:把每个处理步骤写成一个无服务器函数,照片一到对象存储就自动触发函数处理,处理完生成缩略图回写存储。没有请求就不执行、不花钱;并发突然冲高,平台自动帮你扩函数实例。唯一要当心的是函数超时限制——如果单张照片处理超过平台上限(通常几分钟),就得拆步骤或换方案。无服务器适合"负载突发、任务短小、事件驱动"的场景。
三种方案没有谁"最好",只有谁最贴你的团队结构与业务形态:人力富余选容器,追求极致省心选无服务器,有硬性环境要求选虚拟机。现实中很多团队会混用——长驻的 Web 服务用容器,突发批处理用无服务器。
不是。Kubernetes 是容器编排平台,管的是"容器怎么部署、怎么伸缩、怎么互相发现",不是"怎么切分物理资源"。虚拟化解决资源切分,Kubernetes 解决切分之后怎么管,两者分工不同、常被一起使用。详见第 5.1 节。
不能直接用普通容器跑完整 Windows。Windows 容器是特例,且需要 Windows 宿主机;异构的"Linux 上跑 Windows"需要虚拟机层。所以判断"能不能容器化"时,先确认应用与系统栈的兼容性。
Docker 是最流行的容器运行时与工具集,容器是通用技术概念。除了 Docker,还有 containerd、Podman、CRI-O 等运行时。可以说 Docker 让容器普及,但不能说容器就是 Docker。
不一定。无服务器按执行计费,对"稀疏、突发"负载很划算;但如果是 24 小时高频稳定调用,包时长的虚拟机反而更便宜。所谓"便宜"取决于负载形态,账单导向的选择必须用真实用量说话。
以云原生的主流方向看,容器(及编排)更贴近今天的工程现实;但虚拟机是理解云资源模型的地基,且数据库、遗留系统仍大量跑在虚拟机上。建议顺序:先吃透虚拟机,再学容器,最后了解无服务器。地基越稳,上面的名词越不容易晃。
云的骨架已经立起来了:概念、服务模型、部署模型、虚拟化。接下来第 2 章把这些骨架填上血肉——看看云厂商货架上到底摆着哪些服务。