Skip to content

容器隔离原理:Namespace 与 Cgroups

一句话机制

容器技术的核心功能,是通过约束和修改进程的动态表现为它创造一个「边界」:Namespace 负责隔离(改视图),Cgroups 负责限制(限资源)。一个 Docker 容器 = 一个启用了多个 Namespace 的宿主机进程,其可用资源受 Cgroups 配额约束。

两个内核特性,各司其职

特性职责机制
Namespace隔离修改进程视图,让它只能看到限定的文件/网络/进程/用户等(Mount、UTS、IPC、Network、User、PID)
Cgroups限制限制进程组可用的资源上限(CPU、内存、IO…),接口是文件系统 /sys/fs/cgroup

创建容器时传入一组 Namespace 参数,容器进程就只能看到当前 Namespace 限定的文件、设备、状态与配置。

不变量

  1. 容器 = 宿主机上的普通进程。对宿主机来说,容器进程和普通进程没有区别,都由宿主机 OS 统一管理,只是启动时多加了一组 Namespace 参数 + 受 Cgroups 约束。
  2. 隔离的边界由宿主机内核负责,不是 Docker Engine。Docker 只负责下发「隔离参数」,真正执行隔离的是 Linux 内核。
  3. Namespace 与 Cgroups 缺一不可。只用 Namespace 隔离不彻底(多个容器仍共享同一内核、时间等资源无法被 Namespace 化),必须靠 Cgroups 兜住资源上限。

与虚拟机的本质区别

  • 虚拟机:Hypervisor 靠硬件虚拟化模拟出完整硬件,再装完整 OS;隔离由 Hypervisor 负责,重、启动慢。
  • 容器:没有自己的内核,应用直接运行在宿主机内核上;隔离由宿主机 OS 负责,轻、秒级启动。

常见误解

  • ❌ 「Docker 是轻量级虚拟机」——错。容器没有自己的内核,直接复用宿主机内核,与「模拟硬件 + 装 OS」的虚拟化是两条路线。
  • ❌ 「只要 Namespace 就能隔离干净」——错。Namespace 只能改视图,管不住资源抢占;而且时间这类资源无法 Namespace 化,必须靠 Cgroups。
  • ❌ 「隔离是 Docker Engine 做的」——错。Docker Engine 只是编排,真正的隔离执行者是宿主机 Linux 内核。

关联

最近更新