🎓 总站 🏠 本课目录 01 概论 02 虚拟化 03 云原生 04 K8s基础 05 K8s进阶 06 消息队列 07 分布式存储 08 分布式文件系统 09 并行编程 10 Spark
云计算技术 · 第2章

虚拟化技术与 Docker

怎么把一台物理机切给多个用户?理解虚拟化定义与分类、Hypervisor 两种架构、CPU/内存/IO 虚拟化原理,以及容器与 Docker 镜像分层。

📚 学习进度
0%

🎯学习目标

  • 理解虚拟化的产生动机(硬件性能过剩、数据中心资源利用率低);
  • 掌握虚拟化的定义与带来的优势;
  • 区分软件虚拟化与硬件虚拟化、全虚拟化与半虚拟化;
  • 掌握 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 的两大职责:① 物理硬件资源→虚拟资源的逻辑映射;② 虚拟机的上下文隔离,保障多租户安全。

Type 1 · 裸机虚拟化 Type 2 · 寄居虚拟化 VM VM VM Hypervisor (VMM) 物理硬件 直接跑在裸机上 · 如 KVM(数据中心) 性能最接近物理机,硬件兼容要求高 VM VM Hypervisor (进程) Host OS 宿主操作系统 物理硬件 跑在 Host OS 上 · 如 VMware(个人PC)
图1 · Hypervisor 两种架构:Type1 裸机(直接跑硬件)vs Type2 寄居(跑在 Host OS 上)
对比裸机虚拟化(Type1)寄居虚拟化(Type2)
位置直接运行于裸机硬件之上作为普通进程运行在 Host OS 之上
代表KVM(数据中心)VMware(个人 PC)
性能最接近物理机(省去 Host OS 损耗)开销大(I/O 需经 Host OS 转发,上下文切换频繁)
兼容/部署硬件兼容要求严格、部署难硬件兼容好、部署方便

6硬件资源虚拟化原理

三类硬件资源虚拟化 CPU 虚拟化VT-x 硬件加速Root/Non-Root 模式 内存虚拟化影子页表(软)→EPT(硬)两次地址转换 I/O 虚拟化全虚拟化→半虚拟化→硬件直通(零损耗)
图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)、弹性迟缓(分钟级启动)、交付困难(环境依赖不一致)。容器化应运而生。

虚拟机 容器 App ABins/Libs App BBins/Libs App CBins/Libs Guest OS Guest OS Guest OS Hypervisor 主机操作系统 / 硬件 每个 VM 跑完整 OS · 笨重 · 分钟级启动 App ABins/Libs App BBins/Libs App CBins/Libs 容器引擎 (Docker) 主机操作系统(共享内核) 硬件 共享内核 · 只隔离应用依赖 · 秒级启动
图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 隔离强;容器因共享内核相对弱。
选型:强隔离/多租户安全敏感场景用 VM;快速弹性伸缩、微服务、CI/CD 用容器。
例题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