虚拟化与容器
把一台物理机虚拟成许多台,有两条技术路线:虚拟机(虚拟整个硬件)与容器(共享内核、隔离视图)。本章讲硬件虚拟化、Hypervisor 类型、容器的三件套,以及两者的隔离强度与开销比较。
**虚拟机(VM)**虚拟整个硬件:CPU、内存、设备,Guest 操作系统不知道自己被虚拟。两种路线:
- 纯软件虚拟化(早期:二进制翻译):慢,逐条翻译指令;
- 硬件辅助虚拟化(VT-x / AMD-V):CPU 增加特权模式,Guest 内核跑在"非 root 模式",敏感指令陷入 Hypervisor——现代虚拟化的基础,性能接近裸机。
Hypervisor 类型:
- Type 1(裸金属):直接跑在硬件上(Xen、ESXi、KVM 内置在 Linux);
- Type 2(宿主):跑在 OS 之上(VirtualBox、Parallels)。
半虚拟化(paravirtualization):Guest 知道自己被虚拟,用超级调用(hypercall)代替陷入—— virtio 设备(网络/磁盘的半虚拟化前端)让 I/O 接近原生。
EPT/NPT(嵌套页表)让地址翻译由硬件两级完成(Guest 虚拟地址 → Guest 物理 → Host 物理),否则影子页表要软件维护、代价高昂。
容器:隔离视图 + 资源限制
Section titled “容器:隔离视图 + 资源限制”容器 = 命名空间(隔离"看到什么")+ cgroups(限制"用多少")+ 联合文件系统(打包与分层)——不是虚拟化硬件,是共享内核的进程级隔离:
- 命名空间(namespaces):PID(进程表)、NET(网络栈)、MNT(挂载点)、UTS(主机名)、IPC、USER——每个容器看到自己独立的视图;
- cgroups:CPU、内存、I/O、pids 的配额与统计——限制资源使用;
- 联合文件系统(overlayfs):镜像分层与写时复制——镜像只读层叠加可写层,多个容器共享同一只读层,写时才复制到自己的可写层。
容器的"启动"就是创建一组命名空间 + 启动进程——毫秒级(对比虚拟机的秒级),因为不启动内核。
VM 与容器的比较
Section titled “VM 与容器的比较”| 虚拟机 | 容器 | |
|---|---|---|
| 隔离强度 | 强(独立内核) | 弱(共享内核) |
| 启动 | 秒级 | 毫秒级 |
| 密度 | 十~百 | 百~千 |
| 开销 | 内存 + 转换成本 | 几乎无 |
| 内核版本 | 各自任意 | 共享宿主内核 |
容器共享内核,隔离弱于虚拟机:内核漏洞(提权、逃逸)在容器间共享;容器逃逸是真实的攻击面(→ 内存安全与常见漏洞)。安全敏感的多租户用 VM(或 kata 等"VM + 容器接口"的混合)。
为什么成为云计算的基础
Section titled “为什么成为云计算的基础”- VM 解决了资源隔离与多租户:一台机器卖成许多台,租户互不干扰——IaaS 的基础;
- 容器解决了部署与打包:应用 + 依赖打成一个镜像,任何装了容器运行时的机器上行为一致——PaaS 与微服务的部署单位。
两者的组合是云的默认形态:物理机上跑 VM(隔离租户),VM 里跑容器(部署应用)。Kubernetes 把容器的调度、扩缩、自愈做成平台——它假设的是容器模型(共享内核、快速启停)。
- 硬件辅助虚拟化(VT-x)让 VM 性能接近裸机;virtio 与 EPT 是两个关键加速
- 容器 = 命名空间(隔离视图)+ cgroups(限制资源)+ 联合文件系统(分层)
- 容器共享内核,隔离弱于虚拟机;隔离敏感的多租户用 VM 或混合方案
- 镜像分层与写时复制让容器启动毫秒级、存储共享
- VM 解决多租户,容器解决部署打包;组合是云的默认形态