yaodebian @ yaodebian.me

Kubernetes 1-1:Docker 与虚拟机

Feb 20

在正式理解 Kubernetes 之前,有一个基础问题必须搞清楚:

Docker 和虚拟机到底有什么区别?

很多人会简单回答一句:Docker 更轻量,虚拟机更重。 但为什么轻?重在哪?背后的技术差异是什么?这一篇我们讲清楚。


一、虚拟机到底在“虚拟”什么?

虚拟机(Virtual Machine,VM)的核心目标是:

在一台物理机器上,模拟出多台“完整的计算机”。

实现这一点的关键技术是 虚拟化(Virtualization)

典型虚拟机软件有:

  • VMware
  • VirtualBox
  • KVM(Linux 内核内置虚拟化模块)

1️⃣ 全虚拟化(Full Virtualization)

全虚拟化的特点是:

  • 完整模拟一套硬件
  • 每个虚拟机都有自己的:
    • CPU
    • 内存
    • 磁盘
    • 网卡
    • BIOS
  • 可以运行完全独立的操作系统

比如:

你在 Mac 上开一个 Ubuntu 虚拟机:

  • Mac 是宿主机(Host OS)
  • Ubuntu 是客户机(Guest OS)

虚拟机里跑的 Ubuntu 根本不知道自己是“假的”。

优点

  • 隔离性极强
  • 可以运行不同操作系统(Linux / Windows)

缺点

  • 每个虚拟机都要安装一个完整 OS
  • 启动慢
  • 占用内存大
  • 资源消耗重

简单理解:

虚拟机 = 在你电脑里再装一台电脑


2️⃣ 半虚拟化(Para-Virtualization)

半虚拟化是一种**“妥协”后的优化**思路。

在全虚拟化中,Guest OS 以为自己独占硬件,发出的指令(如特权指令)会被 Hypervisor 捕获并模拟,这个过程开销很大(Trap-and-Emulate)。

而在半虚拟化中:

  • Guest OS 知道自己是虚拟机:操作系统内核经过修改(或安装特定驱动),知道自己运行在虚拟环境中。
  • 直接调用 Hypervisor:Guest OS 不再傻傻地去操作“硬件”,而是通过 Hypercall(超级调用) 直接请求 Hypervisor 帮忙处理(类似用户态程序调用 Kernel 的 Syscall)。
  • 协作而非模拟:省去了繁琐的指令捕获和模拟过程。

典型代表:

  • 早期的 Xen(需要修改内核)。
  • 现代 KVM 中的 VirtIO(I/O 半虚拟化驱动):让磁盘和网卡操作直接通过共享内存等高效方式与宿主机通信,极大地提高了 I/O 性能。

但无论如何:

虚拟机的本质仍然是“操作系统级别”的隔离


二、Docker 到底在“隔离”什么?

Docker 并不是虚拟机。

Docker 属于:

操作系统级虚拟化(OS-level Virtualization)

它没有模拟硬件,也没有模拟完整 OS。

Docker 的核心技术依赖于 Linux 内核:

  • Namespace(隔离)
  • Cgroups(资源限制)
  • UnionFS(分层文件系统)

也就是说:

Docker 只是把进程隔离起来


一个关键区别

对比项虚拟机Docker
隔离级别操作系统级进程级
是否有独立 OS没有
是否模拟硬件
启动时间分钟级秒级甚至毫秒级
资源占用

三、一个更直观的理解方式

虚拟机

物理机
 ├── Hypervisor
 │    ├── VM1(完整 Linux)
 │    ├── VM2(完整 Linux)
 │    └── VM3(完整 Windows)

每个 VM 都有完整 OS。


Docker

物理机
 ├── Linux 内核
 │    ├── Container 1(App1)
 │    ├── Container 2(App2)
 │    └── Container 3(App3)

所有容器共享同一个 Linux 内核。

它们只是:

被隔离开的进程组


四、为什么 Docker 更轻量?

因为:

  1. 没有 Guest OS
  2. 不需要模拟硬件
  3. 启动本质就是启动一个进程

所以:

  • 一个虚拟机可能占用 1~2GB 内存
  • 一个 Docker 容器可能只占几十 MB

五、安全性谁更强?

从理论上说:

  • 虚拟机隔离更彻底(内核都隔离)
  • Docker 共用内核,安全边界更弱

但:

在生产环境中通过:

  • seccomp
  • AppArmor
  • SELinux
  • rootless container

Docker 的安全性已经足够支撑大规模生产环境。


六、Docker 与 Kubernetes 的关系

Kubernetes 本质上是:

容器编排系统

它管理的对象是:

  • 容器(Container)
  • Pod(容器组)

而不是虚拟机。

如果你理解了:

  • 虚拟机是“模拟电脑”
  • Docker 是“隔离进程”

那么你就能理解:

Kubernetes 是在管理一大堆被隔离的进程

而不是管理一堆小电脑。


七、一句话总结

虚拟机解决的是:

一台机器运行多台操作系统

Docker 解决的是:

一台操作系统安全地运行多个应用


八、给程序员的实战理解方式

如果你是写后端的:

  • 虚拟机 ≈ 买了一台新服务器
  • Docker ≈ 开了一个新进程环境

如果你是做运维的:

  • 虚拟机 = 基础设施层隔离
  • Docker = 应用层隔离

九、总结

这一篇的核心思想只有一句:

虚拟机是“虚拟硬件”,Docker 是“隔离进程”。

搞清楚这点,Kubernetes 就好理解多了。

> comment on mastodon / twitter
>
CC BY-NC-SA 4.0 2021-PRESENT © Anthony Fu