命名空间和控制组是docker容器的两大底层基石:命名空间实现环境隔离,使容器拥有独立pid、网络、文件系统等视图;控制组实施资源限制,管控cpu、内存等使用上限,二者协同确保容器轻量、安全、可控。
命名空间和控制组是 docker 容器实现隔离与资源管理的两大底层基石,一个管“看得见什么”,一个管“能用多少”。它们不是 docker 自己发明的,而是直接复用 linux 内核的成熟机制。
命名空间:负责环境隔离,让容器“自成一世界”
命名空间为容器创建独立的系统视图,使每个容器都像运行在专属系统中。不同类型的命名空间各司其职:
- PID 命名空间:容器内进程 PID 从 1 开始(比如 init 进程),宿主机上却是另一个数字;容器里看不到宿主机或其他容器的进程
- Network 命名空间:容器拥有独立网卡、IP、端口、路由表,彼此网络互不可见,也不影响宿主机网络
- Mount 命名空间:容器有自己挂载点和文件系统视图,/ 是它自己的根目录,修改不会波及宿主机
- UTS 命名空间:容器可设独立主机名和域名(如 myapp-container),不影响宿主机 hostname
- IPC 和 User 命名空间:分别隔离进程间通信通道、用户/组 ID 映射,提升安全边界
控制组(cgroups):负责资源限制,让容器“不抢不占”
命名空间解决“能不能访问”,cgroups 解决“能用多少”。它对容器使用的物理资源做硬性约束和统计:
- 内存上限(--memory=512m):超限时容器内进程会被 OOM killer 终止
- CPU 配额(--cpus=1.5 或 --cpu-quota):防止某个容器吃满 CPU 导致其他容器卡顿
- 磁盘 I/O 限速(--device-read-bps):避免日志写入或大文件拷贝拖垮整台机器 IO
- 支持实时监控:通过 docker stats 查看当前 CPU、内存、网络、块 IO 的实际使用量
两者协同工作,才构成真正的容器
只有命名空间,容器能“隐身”,但可能无限占用资源;只有 cgroups,资源受控但无法隔离环境——进程仍能看到宿主机所有进程、共享网络栈,毫无安全性可言。Docker 启动容器时,会同时启用多个命名空间并关联对应 cgroups 路径,二者缺一不可。
这种组合让容器既轻量(共享内核)、又可靠(强隔离+硬限流),是区别于虚拟机的关键所在。











