虚拟化要解决什么

核心诉求是隔离与资源利用率:在一台物理机上运行多个相互独立的应用环境,互不干扰。

虚拟机:虚拟硬件

虚拟机(VM)通过 Hypervisor(虚拟机监视器)在物理硬件上虚拟出一套完整的硬件环境,每个 VM 都运行一个独立的操作系统。

两种类型:

  • Type 1(裸金属):Hypervisor 直接运行在硬件上(如 ESXi、KVM、Hyper-V);
  • Type 2(宿主型):Hypervisor 运行在宿主操作系统之上(如 VirtualBox)。

优点:隔离性强(每个 VM 有独立内核),可以运行不同的操作系统(Linux 上跑 Windows)。

缺点:

  • 每个 VM 都要跑一个完整的操作系统,内存和磁盘开销大;
  • 启动慢(要引导整个操作系统);
  • 性能损耗相对明显。

容器:共享内核

容器不做硬件虚拟化。它利用操作系统的两个内核特性:

Namespace(命名空间):隔离进程的"视图"。每个容器有自己独立的进程树、网络接口、文件系统挂载点、用户 ID 等。容器内的进程"看不见"其他容器的进程。

Cgroups(控制组):限制资源使用。控制每个容器能用多少 CPU、内存、磁盘 I/O、网络带宽。

优点:

  • 轻量:不需要额外的操作系统,共享宿主内核,镜像体积小;
  • 启动快:本质是启动一个进程,秒级甚至毫秒级;
  • 密度高:同一台机器能跑更多实例;
  • 一致性:"构建一次,到处运行"——镜像包含了应用及其全部依赖。

缺点:

  • 隔离性弱于虚拟机:所有容器共享宿主内核,内核漏洞影响所有容器;
  • 不能运行与宿主不同内核的操作系统(Linux 主机上无法直接跑 Windows 容器)。

安全性考量

这是容器最常被质疑的地方。

虚拟机的边界是硬件虚拟化层,攻击面小,逃逸难度大。

容器的边界是内核的系统调用接口,而 Linux 内核的系统调用数量庞大,攻击面大得多。

因此,多租户或不可信负载场景,通常会:

  • 在 VM 中运行容器(双重隔离);
  • 使用安全容器(如 Kata Containers、gVisor),在容器外再包一层轻量虚拟化或用户态内核;
  • 严格配置 seccomp、AppArmor/SELinux、能力集裁剪。

实践中的选择

  • 要运行不同操作系统、或强隔离需求 → 虚拟机;
  • 微服务、CI/CD、快速扩缩容 → 容器;
  • 两者都要 → 云上的"虚拟机 + 容器"组合,或者安全容器方案。

编排

当容器数量达到成百上千,就需要编排系统(如 Kubernetes)来负责调度、服务发现、自动扩缩容、滚动更新、健康检查与自愈。

Kubernetes 已成为容器编排的事实标准,但它也以复杂著称——是否真的需要它,取决于你的规模。

说明:本文为虚拟化技术的公开知识整理。