Docker 与虚拟机对比
虚拟机和 Docker 容器都能解决「打包运行环境」的问题,但原理截然不同:虚拟机用 Hypervisor 虚拟出整台「假电脑」并安装独立操作系统,容器则共享宿主机内核、只对进程做隔离。理解差异,才知道什么场景该用谁。
结构差异:共享内核 vs 独立内核
从下往上看,虚拟机在宿主机与业务程序之间多出「客户机操作系统」整一层,容器则直接复用宿主内核:
| 层次 | 虚拟机 | Docker 容器 |
|---|---|---|
| 操作系统内核 | 每个虚拟机一个独立内核 | 全部容器共享宿主机内核 |
| 底层支撑 | Hypervisor(KVM、VMware、Hyper-V 等) | 宿主 Linux 内核的容器特性 |
| 打包单位 | 整个虚拟机镜像(含完整系统) | 只含应用层的分层镜像 |
隔离机制:namespace 与 cgroup
容器的隔离来自 Linux 内核的两个机制(K8s、LXC 等底层同样依赖它们):
- namespace:给容器独立的进程、网络、挂载点视图,让容器「看不到」别人的进程;
- cgroup:限制并统计容器可用的 CPU、内存等资源。
一句话:namespace 负责「隔开」,cgroup 负责「限量」。
核心指标对比
| 对比项 | 虚拟机 | Docker 容器 |
|---|---|---|
| 启动速度 | 分钟级(需引导完整系统) | 秒级甚至毫秒级 |
| 资源占用 | 每台数百 MB 起步,含完整系统开销 | 只算进程本身,通常几十 MB |
| 隔离强度 | 强(内核级硬隔离) | 较弱(共享内核,边界在 namespace) |
| 迁移性 | 镜像大、跨平台难 | 镜像分层、体积小,随处可跑 |
镜像分层一句话
Docker 镜像是「一层层只读文件系统」叠加出来的,公共的基础层能被多个镜像复用:拉取新镜像往往只需下载差异层。这就是容器镜像小、迁移快的原因,也是迁移性胜过虚拟机的基础。
各自适合的场景
| 场景 | 推荐 |
|---|---|
| 微服务、CI/CD、快速扩容 | Docker 容器 |
| 需要异种内核(如跑 Windows)或强安全边界 | 虚拟机 |
| 合规要求硬隔离、多租户承载 | 虚拟机 |
| 生产环境常见折中 | 在虚拟机里再跑 Docker |
小结
两者本质区别在于是否共享宿主机内核:容器轻快、秒级启动、迁移方便,适合应用部署;虚拟机隔离强、自成体系,适合内核差异与强安全场景。实践中常以虚拟机承载 Docker,兼取两者之长。