Docker 和虚拟机有什么区别?容器的隔离是怎么实现的?
下面是一段教学用的模拟面试。
🧑💻 面试官:Docker 容器和虚拟机有什么区别?
🙋♂️ 我:容器更轻、更快,虚拟机更重。
🧑💻 面试官:为什么更轻?启动两个 Linux 容器,是启动了两个新的 Linux 内核吗?
🙋♂️ 我:不是,普通 Linux 容器共享所运行环境的内核。
🧑💻 面试官:那各自的进程和网络为什么看起来独立?macOS 上 Docker Desktop 的 Linux 内核又从哪里来?
先看隔离发生在哪一层:「独立的操作系统」,还是「同一内核下被隔离的进程」。
面试速答(60 秒版)
虚拟机通常通过虚拟化层提供虚拟硬件,每台虚拟机运行自己的来宾操作系统和内核。普通 Linux 容器则是一组被隔离的进程,多个容器共享它们所在 Linux 环境的内核。
容器通过 namespace 等机制隔离进程、网络、挂载等视图,通过 cgroups 等机制管理资源用量,因此不需要为每个容器再启动完整来宾内核,启动与部署通常更轻。
但共享内核也意味着隔离边界不同,容器不等于完整虚拟机,更不能天然当成任意不可信代码的绝对安全环境。Docker Desktop 的 Linux 容器通常运行在它管理的 Linux 虚拟机中,所以实际系统也经常是“虚拟机里面再跑容器”,并非必须二选一。

知识点详解:两个服务,为什么各自都觉得自己有一个系统?
虚拟机,多了一份什么?
假设咱们要部署两个服务,希望它们的软件环境互不干扰。
使用虚拟机时,每台虚拟机可以运行自己的来宾操作系统。应用的系统调用进入各自的来宾内核,由虚拟化层把它们放到物理资源上执行。
因此,一台虚拟机里的操作系统升级,并不是直接替换另一台虚拟机的内核。这种隔离与单纯把应用放在两个目录里,不是一个层次。
代价是每台虚拟机还要维护自己的内核、系统服务和相关资源。具体开销取决于方案与配置,但解释“重在哪里”比记一个固定启动时间更有用。
容器不是小一号的独立内核
换成普通 Linux 容器,服务仍然是 Linux 内核管理的进程,只是运行在隔离与约束之下。
容器镜像提供应用文件和用户空间依赖,并不是为每个容器携带并启动一份全新的来宾内核。两个容器可以拥有不同版本的库和工具,却仍共享它们所在环境的 Linux 内核。Docker 容器说明用这点区分容器和虚拟机。
所以,容器里 uname 看到的内核信息,也不能被当成镜像自己带了一份独立内核的证据。
这让容器适合把服务及依赖打包成可部署单元,但也对内核兼容性提出要求。不是任意操作系统应用放进镜像,就能在任意内核上直接运行。
namespace 隔离“看见什么”
假设两个服务各自在容器里查看进程列表,只看到自己的相关进程;它们也可能各自有网络接口、端口和挂载视图。
这些不同视图,来自 PID、network、mount 等 namespace。内核把相关全局资源组织成不同的隔离范围,让进程看起来处在自己的环境里。Linux namespaces 手册列出了各类职责。
但视图独立不等于底下真的有两套物理机器。两个容器看到的 PID 1,可以对应宿主环境里不同的真实进程;实际映射要从相应 namespace 理解。
网络模式、共享挂载与运行权限也会改变隔离效果。使用 host 网络或共享敏感目录时,就不能仍按完全独立的默认视图讨论。
cgroups 管“能用多少”,不是再造一台机器
只隔离视图,不会自动让一个服务只能用两核 CPU 或固定内存。
cgroups 可以把进程组织成组,并对 CPU、内存等资源进行统计和约束。它解决的是资源管理这一部分,与 namespace 的职责不同。内核 cgroup v2 文档说明了这些控制器。
例如 CPU 配额用完,进程可能被节流;内存达到相关限制,则可能触发回收或 OOM 处理。应用虽然以为自己在独立环境中,也不能因此无视这些预算。
所以,排查容器变慢时,不只看宿主机还有多少空闲,还要检查当前容器的限额与节流。

为什么容器隔离不等于绝对安全?
多个容器共享内核,内核漏洞和错误权限配置可能影响隔离。特权容器、宽泛 capabilities、挂载宿主机敏感路径,以及暴露 Docker 控制入口,都可能扩大影响范围。
实际还要结合最小权限、只读文件系统、系统调用限制和安全策略等措施。需要运行高风险、不可信代码时,是否再增加虚拟机或其他隔离层,要按威胁模型判断。
这不是说虚拟机绝对不会有风险,而是两者的边界不同,不能因为容器启动快,就把安全承诺写得一样。
Docker Desktop 为什么又出现虚拟机?
咱们在 macOS 上运行 Linux 容器时,应用需要的是 Linux 内核,不能直接把 macOS 内核当成同一种运行环境。
Docker Desktop 通常管理一个 Linux 虚拟机,Linux 容器共享的是这台虚拟机的内核。Docker Desktop 虚拟机说明列出了相应运行后端。Windows 的具体后端和容器模式又需要分别判断,不能用一句话覆盖 Linux 容器与 Windows 容器。
云服务器本身也可能是虚拟机,上面再运行多个容器。因此,“用 Docker 还是用虚拟机”要先看你在选择哪一层:基础运行环境,还是应用部署单元。
验证时,可以查看容器的进程、namespace 与资源限制,再对照实际宿主环境。涉及隔离与限制的实验,应在测试环境进行,不用生产服务试着耗尽内存来证明规则。

面试官继续追问
镜像包含 Ubuntu,为什么不是一台 Ubuntu 虚拟机?
它通常包含 Ubuntu 用户空间文件和依赖,不等于独立启动 Ubuntu 来宾内核。镜像里的发行版名称与实际内核来源要分开看。
一个容器只能有一个进程吗?
不是技术上只能一个。常见部署习惯是保持职责清楚,但容器内部可以有多个进程,还要处理信号、子进程回收等问题。
容器一定比虚拟机快吗?
不能对所有负载保证。容器通常减少独立系统开销,但真实执行性能还受资源限制、文件系统、网络与运行平台影响,应按具体场景测试。
面试速记卡
- 虚拟机:虚拟化层上运行独立来宾系统与内核。
- Linux 容器:隔离的进程组,共享所在 Linux 环境的内核。
- namespace:隔离视图;cgroups:管理和约束资源。
- 安全:共享内核与权限配置决定风险,不承诺绝对隔离。
- Desktop:Linux 容器常运行在 Linux 虚拟机里,两种技术可以叠加。
公司面试真题
真题根据求职者公开面经整理,题意经过概括,非逐字原话或公司官方题库;本文为 Sunday 的独立解析。
美团 · Java后端 · 社招
容器化解决什么问题,原理是什么?(题意整理)
社招一年半面经分享 · 美团部分 ↗
历史面经,面试年份未明确;页面编辑于 2024-07-19