面试知识库
高 基础

Docker与虚拟机区别#

一句话答案#

Docker 共享宿主机内核、秒级启动、MB 级开销;虚拟机独立 OS、分钟级启动、GB 级开销。

核心要点

维度Docker 容器虚拟机
虚拟化层OS 级(共享内核)硬件级(Hypervisor)
启动速度秒级分钟级
资源占用MB 级GB 级
性能接近原生有虚拟化开销
隔离性进程级(较弱)完全隔离(强)
密度单机数百容器单机十几个 VM

Docker 适合微服务部署/CI-CD/开发环境一致性;VM 适合强隔离/不同 OS 场景

为什么容器轻、VM 重(底层机制)#

VM: Hypervisor(KVM/ESXi)虚拟出一套硬件,每个 VM 装完整 Guest OS(含独立内核)。CPU 指令要经虚拟化层、I/O 走虚拟设备,且每个 VM 常驻一份内核 + 系统进程,故 GB 级内存、分钟级启动。

容器: 容器进程直接运行在宿主内核上,“隔离”只是内核两个机制叠加,没有 Guest OS、没有 Hypervisor:

  • Namespace(隔离视图): 内核给进程 task_struct 挂命名空间指针,常说的六类——PID(独立进程树,容器内 PID=1)、NET(独立网卡/路由/端口)、MNT(独立文件系统视图)、UTS(独立主机名)、IPC、USER(UID 映射);现代内核还有 Cgroup(4.6+)和 Time(5.6+)两类,共 8 类。靠 clone/unshare/setns 三个系统调用创建、脱离、加入。
  • Cgroup(资源限制): 层级树分组计量资源——CPU 用配额/周期限核数(cgroup v1 为 cpu.cfs_quota_us/cpu.cfs_period_us,现代发行版默认的 cgroup v2 为 cpu.max),内存超上限(v1 memory.limit_in_bytes / v2 memory.max)触发 cgroup OOM kill。
  • 结论: 容器本质是”被 Namespace + Cgroup 圈起来的宿主机进程”,复用宿主内核 → MB 级开销、秒级启动;代价是共享内核 → 隔离弱(见下)。

隔离强度差异的根因#

容器共享宿主内核 → 一旦容器逃逸(如内核漏洞、--privileged)可直达宿主;VM 有 Guest 内核 + Hypervisor 双层屏障,Guest 被攻破也难穿透 Hypervisor。gVisor(用户态内核拦截 syscall)、Kata(轻量 VM 包容器)就是在容器上补强隔离。

面试回答(2分钟版)

Docker和虚拟机最本质的区别在于虚拟化层次不同。虚拟机通过Hypervisor模拟完整硬件,每个VM跑一个独立OS,隔离性强但开销大——GB级内存、分钟级启动。Docker则是OS级虚拟化,所有容器共享宿主机内核,通过Linux Namespace做进程、网络、文件系统的隔离,用Cgroup限制CPU和内存配额,所以能做到MB级开销、秒级启动、单机跑数百个容器。所以微服务部署、CI/CD 流水线和本地开发环境普遍用Docker,一次构建到处运行,解决环境不一致问题。但Docker隔离性相对弱,如果是多租户需要强安全隔离的场景,比如运行不可信代码,还是会选虚拟机或者gVisor这类方案加固。简单说就是:追求密度和效率选Docker,追求强隔离选VM,实际生产中两者经常配合使用——VM做粗粒度隔离,Docker在VM内做细粒度编排。

追问与易错

追问方向:

  • “Docker 的隔离性为什么比 VM 弱?”→ Docker 共享宿主内核,容器逃逸可攻击宿主机;VM 有独立内核+Hypervisor 双层隔离,即使 Guest OS 被攻破也难穿透 Hypervisor
  • “容器逃逸怎么防范?”→ 不用 —privileged 运行、启用 seccomp/AppArmor 限制系统调用、用 rootless 容器或 gVisor/Kata Containers 加固隔离
  • “什么场景必须用 VM 而不是 Docker?”→ 需要运行不同 OS 内核(如 Windows+Linux 混部)、运行不可信第三方代码需强隔离、合规要求硬件级隔离的金融/政务场景

易错点:

  • ❌ “容器里的 root 就是普通用户,很安全”——默认没开 user namespace 时容器内 root 就是宿主 UID 0,只是被 capabilities/seccomp 削了权;要真正降权需 rootless 或 userns-remap
  • ❌ “Mac/Windows 上 Docker 也是直接共享宿主内核”——Docker Desktop 实际跑在一个轻量 Linux VM 里,容器共享的是这台 VM 的 Linux 内核