Sunday面试指南

Docker 和虚拟机有什么区别?容器的隔离是怎么实现的?

下面是一段教学用的模拟面试。

🧑‍💻 面试官:Docker 容器和虚拟机有什么区别?

🙋‍♂️ 我:容器更轻、更快,虚拟机更重。

🧑‍💻 面试官:为什么更轻?启动两个 Linux 容器,是启动了两个新的 Linux 内核吗?

🙋‍♂️ 我:不是,普通 Linux 容器共享所运行环境的内核。

🧑‍💻 面试官:那各自的进程和网络为什么看起来独立?macOS 上 Docker Desktop 的 Linux 内核又从哪里来?

先看隔离发生在哪一层:「独立的操作系统」,还是「同一内核下被隔离的进程」。

面试速答(60 秒版)

虚拟机通常通过虚拟化层提供虚拟硬件,每台虚拟机运行自己的来宾操作系统和内核。普通 Linux 容器则是一组被隔离的进程,多个容器共享它们所在 Linux 环境的内核。

容器通过 namespace 等机制隔离进程、网络、挂载等视图,通过 cgroups 等机制管理资源用量,因此不需要为每个容器再启动完整来宾内核,启动与部署通常更轻。

但共享内核也意味着隔离边界不同,容器不等于完整虚拟机,更不能天然当成任意不可信代码的绝对安全环境。Docker Desktop 的 Linux 容器通常运行在它管理的 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 处理。应用虽然以为自己在独立环境中,也不能因此无视这些预算。

所以,排查容器变慢时,不只看宿主机还有多少空闲,还要检查当前容器的限额与节流。

namespace 与 cgroups 的职责区别

为什么容器隔离不等于绝对安全?

多个容器共享内核,内核漏洞和错误权限配置可能影响隔离。特权容器、宽泛 capabilities、挂载宿主机敏感路径,以及暴露 Docker 控制入口,都可能扩大影响范围。

实际还要结合最小权限、只读文件系统、系统调用限制和安全策略等措施。需要运行高风险、不可信代码时,是否再增加虚拟机或其他隔离层,要按威胁模型判断。

这不是说虚拟机绝对不会有风险,而是两者的边界不同,不能因为容器启动快,就把安全承诺写得一样。

Docker Desktop 为什么又出现虚拟机?

咱们在 macOS 上运行 Linux 容器时,应用需要的是 Linux 内核,不能直接把 macOS 内核当成同一种运行环境。

Docker Desktop 通常管理一个 Linux 虚拟机,Linux 容器共享的是这台虚拟机的内核。Docker Desktop 虚拟机说明列出了相应运行后端。Windows 的具体后端和容器模式又需要分别判断,不能用一句话覆盖 Linux 容器与 Windows 容器。

云服务器本身也可能是虚拟机,上面再运行多个容器。因此,“用 Docker 还是用虚拟机”要先看你在选择哪一层:基础运行环境,还是应用部署单元。

验证时,可以查看容器的进程、namespace 与资源限制,再对照实际宿主环境。涉及隔离与限制的实验,应在测试环境进行,不用生产服务试着耗尽内存来证明规则。

Docker Desktop 的 Linux 虚拟机与容器嵌套

面试官继续追问

镜像包含 Ubuntu,为什么不是一台 Ubuntu 虚拟机?

它通常包含 Ubuntu 用户空间文件和依赖,不等于独立启动 Ubuntu 来宾内核。镜像里的发行版名称与实际内核来源要分开看。

一个容器只能有一个进程吗?

不是技术上只能一个。常见部署习惯是保持职责清楚,但容器内部可以有多个进程,还要处理信号、子进程回收等问题。

容器一定比虚拟机快吗?

不能对所有负载保证。容器通常减少独立系统开销,但真实执行性能还受资源限制、文件系统、网络与运行平台影响,应按具体场景测试。

面试速记卡

  • 虚拟机:虚拟化层上运行独立来宾系统与内核。
  • Linux 容器:隔离的进程组,共享所在 Linux 环境的内核。
  • namespace:隔离视图;cgroups:管理和约束资源。
  • 安全:共享内核与权限配置决定风险,不承诺绝对隔离。
  • Desktop:Linux 容器常运行在 Linux 虚拟机里,两种技术可以叠加。

公司面试真题

真题根据求职者公开面经整理,题意经过概括,非逐字原话或公司官方题库;本文为 Sunday 的独立解析。

浏览公司面试真题 →
简历汪永久免费在线制作简历,模板直接套用、导出无水印,永久免费、下载免费,不需要付费解锁任何功能。去写简历