结论:容器隔离靠 Linux Namespace 实现视图隔离,资源限制靠 Cgroups 实现配额控制,两者配合把普通进程变成容器。

展开:Namespace 有七类,容器主要用六个:PID(进程编号隔离,容器内 PID 1 是自身 init)、NET(独立网络栈)、MNT(挂载点隔离,配合 pivot_root 切换根目录)、UTS(主机名)、IPC(进程间通信)、USER(用户 UID 映射,rootless 容器的基础)。可以用 lsns 或读 /proc/<pid>/ns/ 查看。Cgroups(v2 已成主流)负责限制和统计资源:cpu 子系统通过 cfs quota 限核数、memory 子系统限额超限触发 OOM Kill、blkio 限磁盘 IO。docker run -m 512m --cpus=1.5 就是写 cgroup 文件。关键追问:1)为什么容器里看到的内存/CPU 是宿主机总量?因为 /proc 未隔离,早期 JVM 因此拿错堆大小,需容器感知参数或 lxcfs。2)容器内 OOM 和宿主机 OOM 的区别。3)Capabilities 和 Seccomp 进一步裁剪系统调用权限,--privileged 等于放弃大部分防护,生产禁用。本质:容器不是沙箱,是被多重内核机制约束的进程。