虚拟化技术与 Docker
怎么把一台物理机切给多个用户?理解虚拟化定义与分类、Hypervisor 两种架构、CPU/内存/IO 虚拟化原理,以及容器与 Docker 镜像分层。
🎯学习目标
- 理解虚拟化的产生动机(硬件性能过剩、数据中心资源利用率低);
- 掌握虚拟化的定义与带来的优势;
- 区分软件虚拟化与硬件虚拟化、全虚拟化与半虚拟化;
- 掌握 Hypervisor 的两种典型架构(裸机 Type1 / 寄居 Type2);
- 理解 CPU(VT-x)、内存(影子页表/EPT)、I/O 三类硬件资源虚拟化原理;
- 对比容器与虚拟机,掌握 Docker 架构、Namespace/Cgroup、镜像分层与 UnionFS。
1虚拟化的产生动机
- 硬件性能过剩:摩尔定律下晶体管每 18 个月翻倍,CPU 主频 30 年涨了近 1500 倍。
- 数据中心痛点:一台普通 PC 服务器的 CPU 负载通常只有 5%~15%,大量电力、场地和维护成本被闲置硬件消耗。
💡 核心矛盾极低的资源利用率 + 高昂的运营成本 → 需要一种技术把一台物理机"切分"给多个用户,这就是虚拟化。
2虚拟化的定义与优势
虚拟化(Virtualization)是一种资源管理技术,将计算机的各种实体资源(CPU、内存、磁盘、网络适配器等)予以抽象、转换后呈现出来,可供分割、组合为一个或多个电脑配置环境。从软件角度看,虚拟机 = 真实机器。
虚拟机:由虚拟化层提供的高效、独立的虚拟计算机系统。虚拟化让每个进程看起来都拥有单独的硬件资源。
虚拟化带来的优势
📊
资源利用率
资源动态分配和调度。
⚙️
运维成本
自动化开通能力。
🚚
升级迁移
平滑升级、跨硬件迁移。
🧪
测试生产
安全的隔离环境。
3软件虚拟化 vs 硬件虚拟化 ⭐
核心问题:如何实现虚拟化——怎么"骗过 OS",让每个进程看起来拥有单独的硬件资源?
💾
软件虚拟化
Software / VMM通过虚拟机监控器(VMM)捕获并翻译特权指令。兼容性好,但性能开销大、实现复杂。QEMU、VMware
🔌
硬件虚拟化
Hardware-assisted依靠 CPU 等底层硬件架构级扩展,增加专门给虚拟机的特权指令通道(Ring -1)。无需软件干预,性能极高,但与硬件绑定。Intel VT-x、AMD-v
⭐ 软件 vs 硬件虚拟化(必考)软件虚拟化:VMM 截获 Ring0 指令并转化,兼容性好但慢;硬件虚拟化:在 CPU 芯片直接支撑虚拟化指令,性能高但绑定硬件。
4虚拟化发展历程
| 时代 | 代表 | 关键贡献 |
|---|---|---|
| 1.0(大型机) | IBM System/360 | 提出虚拟化概念,解决大型机多用户分时共享 |
| 2.0(全虚拟化) | VMware | 提出全虚拟化方案,解决 x86 架构不适合虚拟化的缺陷 |
| 3.0(半虚拟化) | Xen(剑桥大学) | 开源,提出半虚拟化,修改 Guest OS 执行特权指令 |
| 4.0(KVM) | KVM | 深度集成于 Linux 内核,企业公有云 IaaS 标准 |
5Hypervisor 两种典型架构 ⭐
Hypervisor / VMM 的两大职责:① 物理硬件资源→虚拟资源的逻辑映射;② 虚拟机的上下文隔离,保障多租户安全。
图1 · Hypervisor 两种架构:Type1 裸机(直接跑硬件)vs Type2 寄居(跑在 Host OS 上)
| 对比 | 裸机虚拟化(Type1) | 寄居虚拟化(Type2) |
|---|---|---|
| 位置 | 直接运行于裸机硬件之上 | 作为普通进程运行在 Host OS 之上 |
| 代表 | KVM(数据中心) | VMware(个人 PC) |
| 性能 | 最接近物理机(省去 Host OS 损耗) | 开销大(I/O 需经 Host OS 转发,上下文切换频繁) |
| 兼容/部署 | 硬件兼容要求严格、部署难 | 硬件兼容好、部署方便 |
6硬件资源虚拟化原理
图3 · 硬件资源虚拟化三大领域:CPU(VT-x)、内存(EPT)、I/O(模拟—半虚拟化—直通)
① CPU 虚拟化(VT-x 硬件加速)
CPU 指令分级(Ring0~Ring3),Guest OS 执行特权指令会触发 Trap(陷入)。解决权限冲突的两条路:软件虚拟化由 VMM 截获 Ring0 指令并转化;硬件虚拟化在 CPU 芯片直接支撑。
💡 VT-x 核心思想(平行宇宙)引入两种操作模式:根模式(Root)给 VMM 运行,非根模式(Non-Root)给 VM 运行。Non-Root 也有完整 Ring0~Ring3,Guest OS 可直接使用(硬件直接运行);只有当 Guest OS 试图执行影响物理硬件的指令时,才把控制权交给 VMM。VT-x(Intel X86)、VT-i(Itanium)、AMD-v(AMD)
② 内存虚拟化
物理机只需一次转换(虚拟地址→物理地址);虚拟机需两次转换(虚拟地址→Guest 伪物理地址→物理地址)。
| 方式 | 原理 | 特点 |
|---|---|---|
| 影子页表(SPT,软件) | Hypervisor 自己维护,记录 Guest 伪物理地址→物理地址,拦截/更新/同步所有转换 | 两次转换,内存读写缓慢 |
| 扩展页表(EPT,硬件) | 由 MMU 硬件完成两次地址转换 | 硬件查询维护,效率高、速度快 |
③ I/O 虚拟化(模拟—半虚拟化—直通)
| 方式 | 原理 | 特点 |
|---|---|---|
| 全虚拟化 | VMM 纯软件截获并模拟硬件行为 | 兼容性最高 |
| 半虚拟化 | Guest OS 装特制驱动,主动与 VMM 协同完成 I/O(Xen) | 性能更优 |
| 硬件直通(Passthrough/SR-IOV) | 虚拟机直接独占物理网卡 | 零损耗 |
7容器 vs 虚拟机 ⭐
虚拟化的局限性:资源冗余(每个 VM 都跑完整 Guest OS)、弹性迟缓(分钟级启动)、交付困难(环境依赖不一致)。容器化应运而生。
图2 · 虚拟机 vs 容器:VM 每个跑完整 Guest OS;容器共享宿主内核,仅隔离应用与依赖
| 对比 | 虚拟机 | 容器 |
|---|---|---|
| 隔离层级 | Hypervisor + 完整 Guest OS | 共享宿主内核,只隔离应用及依赖库 |
| 资源占用 | 笨重(每个 VM 跑完整 OS) | 极致轻量 |
| 启动速度 | 分钟级 | 秒级 / 毫秒级 |
| 隔离性/安全 | 强 | 相对弱(共享内核) |
8Docker 架构、内核基石与镜像分层
Docker C/S 架构
| 组件 | 职责 | 典型操作 |
|---|---|---|
| Docker Client | 命令行客户端 | build、run |
| Docker Daemon(dockerd) | 守护进程,真正干活 | 构建/运行容器 |
| Docker Registry | 容器镜像仓库 | pull、push、search |
Linux 内核基石
Docker 容器靠封装 Linux 内核 API 实现隔离:
| 机制 | 作用 | 说明 |
|---|---|---|
| Namespace | 环境隔离 | PID(进程)、NET(网络)、MNT(文件系统)、UTS(主机名)、IPC(进程通信)、USER(用户权限) |
| Cgroup | 资源限制(control group) | 控制一组进程的资源使用、起始、优先级,位于 /sys/fs/cgroup |
💡 一句话Namespace 管"看得见什么"(隔离),Cgroup 管"能用多少"(限制)。
clone(CLONE_NEWPID|CLONE_NEWNET) 创建新命名空间。镜像与容器的分层结构
- 镜像层是只读层;容器运行时在镜像层之上添加一个可写层。
- 相同基础层(系统环境、语言库)在服务器上仅存一次,大规模镜像分发的网络和存储成本大幅降低。
- 联合文件系统(UnionFS):将分属不同物理位置的只读目录合并挂载到一个虚拟文件系统位置(挂载点)。容器启动后 Docker Engine 在顶端动态附加一层可写层,容器生命周期内所有文件系统操作都发生在顶部可写层。
import docker
# 1. 连接本地 Docker 守护进程(Daemon)
client = docker.from_env()
# 2. 从云端 Registry(如 Docker Hub)拉取镜像
image = client.images.pull("nginx", tag="alpine")
print(f"镜像拉取成功! 占用存储: {image.attrs['Size']/1024/1024:.1f} MB")
# 3. 创建并启动容器
container = client.containers.run("nginx:alpine", detach=True, ports={'80/tcp': 8080})
# 4. 查看状态、停止删除
print(container.status)
container.stop(); container.remove()
⭐重点例题
例题1:容器与虚拟机如何对比与选型?
问:从隔离层级、资源占用、启动速度、安全性四个维度对比容器与虚拟机,并说明各自适用场景。
答:
- 隔离层级:VM 靠 Hypervisor + 完整 Guest OS;容器共享宿主内核,仅隔离应用依赖。
- 资源占用:VM 笨重;容器极致轻量。
- 启动速度:VM 分钟级;容器秒级/毫秒级。
- 安全性:VM 隔离强;容器因共享内核相对弱。
例题2:为什么 EPT 比影子页表快?
问:虚拟机内存需两次地址转换,影子页表(SPT)与扩展页表(EPT)有何区别?
答:SPT 由 Hypervisor 软件维护,需拦截、更新、同步所有内存转换,两次转换导致读写缓慢;EPT 由 MMU 硬件直接完成两次地址转换,硬件查询维护,效率高、速度快。
🎯自测(点击展开)
虚拟化产生的核心动机是什么?
硬件性能过剩 + 数据中心 CPU 负载仅 5%~15% 的低资源利用率与高运营成本。
Type1 和 Type2 Hypervisor 有什么区别?
Type1 裸机虚拟化直接跑在硬件上(如 KVM),性能最接近物理机;Type2 寄居虚拟化跑在 Host OS 上(如 VMware),部署方便但开销大。
VT-x 引入了哪两种操作模式?
根模式(Root,VMM 运行)和非根模式(Non-Root,VM 运行)。Guest OS 在 Non-Root 直接运行,遇到影响硬件的指令才交给 VMM。
容器靠哪两个 Linux 内核机制实现隔离和限制?
Namespace(环境隔离:PID/NET/MNT/UTS/IPC/USER)和 Cgroup(资源限制)。
Docker 镜像分层有什么好处?
镜像层只读、容器层可写;相同基础层仅存一次,大幅降低镜像分发的网络和存储成本。靠 UnionFS 联合挂载。
📝强化题库
选择题点选即时判分;填空题输入后"检查"或"显示答案"。
已答 0/0答对 0正确率 —
已答 0/0答对 0