主题
容器隔离原理:Namespace 与 Cgroups
一句话机制
容器技术的核心功能,是通过约束和修改进程的动态表现为它创造一个「边界」:Namespace 负责隔离(改视图),Cgroups 负责限制(限资源)。一个 Docker 容器 = 一个启用了多个 Namespace 的宿主机进程,其可用资源受 Cgroups 配额约束。
两个内核特性,各司其职
| 特性 | 职责 | 机制 |
|---|---|---|
| Namespace | 隔离 | 修改进程视图,让它只能看到限定的文件/网络/进程/用户等(Mount、UTS、IPC、Network、User、PID) |
| Cgroups | 限制 | 限制进程组可用的资源上限(CPU、内存、IO…),接口是文件系统 /sys/fs/cgroup |
创建容器时传入一组 Namespace 参数,容器进程就只能看到当前 Namespace 限定的文件、设备、状态与配置。
不变量
- 容器 = 宿主机上的普通进程。对宿主机来说,容器进程和普通进程没有区别,都由宿主机 OS 统一管理,只是启动时多加了一组 Namespace 参数 + 受 Cgroups 约束。
- 隔离的边界由宿主机内核负责,不是 Docker Engine。Docker 只负责下发「隔离参数」,真正执行隔离的是 Linux 内核。
- Namespace 与 Cgroups 缺一不可。只用 Namespace 隔离不彻底(多个容器仍共享同一内核、时间等资源无法被 Namespace 化),必须靠 Cgroups 兜住资源上限。
与虚拟机的本质区别
- 虚拟机:Hypervisor 靠硬件虚拟化模拟出完整硬件,再装完整 OS;隔离由 Hypervisor 负责,重、启动慢。
- 容器:没有自己的内核,应用直接运行在宿主机内核上;隔离由宿主机 OS 负责,轻、秒级启动。
常见误解
- ❌ 「Docker 是轻量级虚拟机」——错。容器没有自己的内核,直接复用宿主机内核,与「模拟硬件 + 装 OS」的虚拟化是两条路线。
- ❌ 「只要 Namespace 就能隔离干净」——错。Namespace 只能改视图,管不住资源抢占;而且时间这类资源无法 Namespace 化,必须靠 Cgroups。
- ❌ 「隔离是 Docker Engine 做的」——错。Docker Engine 只是编排,真正的隔离执行者是宿主机 Linux 内核。
关联
- 上游:Docker的实现基础
- 同域:Docker技术栈总览 · Docker镜像分层与联合文件系统
- 域地图:运维与云原生