面试知识库
基础

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 映射)。靠 clone/unshare/setns 三个系统调用创建、脱离、加入。
  • Cgroup(资源限制): 层级树分组计量资源——CPU 用 cfs_quota_us/cfs_period_us 限核数,内存超 limit_in_bytes 触发 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 混部)、运行不可信第三方代码需强隔离、合规要求硬件级隔离的金融/政务场景

易错点:

  • ❌ 只知道概念不知道原理——面试官会追问底层实现
  • ❌ 缺乏实际使用经验——结合项目场景回答更有说服力