cgroup、命名空间与容器
这页讲的是:容器不是一个神秘黑盒,它很大程度上是 Linux 内核现有隔离与资源控制能力的组合。学这页的关键,是把“看起来像独立系统”背后的内核机制拆开看。
这块是什么
命名空间负责“看起来彼此隔离”,cgroup 负责“资源怎么限制和统计”,而容器则把这些能力拼起来,让一组进程看起来像在一个独立小环境里运行。它不是“又造了一个操作系统”,而是在同一个内核上做视图隔离和资源治理。
你可以把容器先理解成:同住一栋楼,但每户人家看到的门牌、房间边界、能用的资源额度都被单独划出来了。
它负责什么
做视图隔离
- 让进程看到不同的进程树、网络视图、挂载视图等
- 让“环境看起来像独立系统”
- 减少互相干扰
- 帮助多租户或多服务共存
做资源控制
- 限制 CPU、内存、I/O 等资源
- 统计资源使用
- 防止某一组进程无限制吃掉机器
- 让资源分配更有秩序
支撑容器运行时
- 为上层容器工具提供内核能力基础
- 把隔离和治理做成可组合机制
- 服务于云原生和多服务部署场景
- 让容器不只是“打包”,而是可运行、可治理
容器看起来像独立环境,靠的是什么
| 能力 | 你现在怎么理解 | 主要作用 |
|---|
| 命名空间 | 给不同进程组展示不同的系统视图。 | 让它们看起来彼此独立,不会直接看到全部系统状态。 |
| cgroup | 把一组进程放进同一资源控制盒子里。 | 让 CPU、内存、I/O 等资源能被限制、统计和治理。 |
| 文件系统视图 | 进程看到的根目录和挂载结构可以被重新组织。 | 让容器像在自己的文件世界里工作。 |
| 网络隔离 | 不同进程组可以看到不同网络接口和配置。 | 帮助容器像“有自己的网络环境”一样运行。 |
关键概念
| 概念 | 现在怎么理解 |
|---|
| cgroup | 对一组进程做资源限制、统计和治理的机制。 |
| 命名空间 | 让不同进程看到不同系统视图的隔离机制。 |
| 容器 | 建立在命名空间、cgroup、文件系统和网络组织方式之上的运行环境。 |
| 资源配额 | 某组进程最多能使用多少资源,不再完全自由争抢。 |
| 多租户隔离 | 让不同服务或工作负载共用一个内核时,仍能尽量互不干扰。 |
为什么重要
- 现代部署大量依赖容器和资源治理,这已经不是边缘主题。
- 它把调度、内存、文件系统、网络等多个基础模块连接到一起。
- 很多线上稳定性问题,本质上都是“资源失控”或“隔离边界不清”。
- 理解这层后,你会更清楚容器到底是 Linux 提供的什么能力组合,而不是把它当成魔法。
常见误解
- 误解一:容器就是轻量虚拟机。实际上两者在共享内核与隔离方式上有本质差异。
- 误解二:命名空间就等于资源限制。实际上命名空间主要负责“看见什么”,cgroup 更偏“能用多少”。
- 误解三:这是云平台才关心的东西。实际上本地开发、测试隔离、服务治理也都大量依赖它。
它不负责什么
- 它不替代调度器和内存管理,而是建立在它们之上施加治理规则。
- 它不自己产生网络和文件系统能力,而是重新组织和隔离已有能力。
- 它不等于 Docker 等工具本身,那些工具只是使用这些内核能力的上层实现。
和其他模块的关系
| 相关模块 | 关系 |
|---|
| 调度器 | CPU 资源控制和配额最终仍然要落到调度行为上。 |
| 内存管理 | 容器内存限制、回收压力和 OOM 行为都与内存子系统密切相关。 |
| 文件系统 | 挂载视图、根文件系统组织和镜像使用都离不开文件系统基础。 |
| 网络 | 网络命名空间和虚拟网络组织让容器拥有相对独立的网络世界。 |
你现在先把容器拆成“看见什么”和“能用多少”
| 问题 | 主要是谁在回答 | 为什么这样拆最清楚 |
|---|
| 这个进程看见哪些 PID、挂载点、网络接口 | 命名空间在回答。 | 它更像在决定“世界长什么样”。 |
| 这组进程最多能吃多少 CPU、内存和 I/O | cgroup 在回答。 | 它更像在决定“资源额度有多大”。 |
| 容器里的根文件系统和进程入口怎么被组织 | 文件系统与运行时工具一起参与。 | 这样你就不会把内核能力和上层容器工具混成一个盒子。 |
| 出了 OOM 或性能抖动该怪谁 | 往往要把 cgroup、内存管理和调度一起看。 | 这解释了为什么容器问题常常不是单一模块能单独讲清。 |
读完这页后,你应该能回答
- 为什么容器不是“独立内核”,而是共享同一个 Linux 内核?
- 命名空间和 cgroup 分别解决什么问题?
- 为什么容器主题会把调度、内存、网络、文件系统都牵进来?
后面适合继续问:命名空间和虚拟机本质差别是什么?cgroup 为什么会影响性能和稳定性?容器里的 OOM 和系统 OOM 有什么关系?