虚拟化要解决什么
核心诉求是隔离与资源利用率:在一台物理机上运行多个相互独立的应用环境,互不干扰。
虚拟机:虚拟硬件
虚拟机(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 已成为容器编排的事实标准,但它也以复杂著称——是否真的需要它,取决于你的规模。
说明:本文为虚拟化技术的公开知识整理。