引言:容器的本质是内核机制的编排
容器技术改变了软件部署的方式,但其底层并非"轻量虚拟机",而是Linux内核已有的三大机制的有机组合:Namespace(资源视图隔离)、Cgroups(资源限额)和UnionFS(分层文件系统)。这些机制自2002年起便存在于内核中,Docker只是将它们工程化地整合。
一、Namespace:资源视图的逻辑隔离
核心思想:让不同进程组"看到"不同的系统资源视图。Linux内核提供8种Namespace:PID Namespace为容器提供独立的进程ID空间,容器内第一个进程PID为1;Network Namespace为每个容器提供独立的网络协议栈——独立网络设备、独立IP地址空间、独立路由表、独立iptables规则集;Mount Namespace控制可见的文件系统挂载点集合,容器的根文件系统切换(pivot_root)依赖此机制;UTS Namespace让容器拥有自己的hostname;IPC Namespace隔离信号量和消息队列;User Namespace通过UID/GID映射实现权限隔离——容器内root在宿主机可能是普通用户;Cgroup Namespace让进程看到相对于cgroup根的相对路径。
二、Cgroups:硬件资源的计量与限额
Control Groups由Google于2006年提出,2008年并入Linux 2.6.24内核。核心架构包含cgroup(按树形层次组织的进程集合)和subsystem(资源控制器)。Cgroups v2(4.5+完整支持,RHEL 8默认)解决了v1问题:所有子系统统一挂载到单一层次树中,进程只能位于叶子节点。关键参数:cpu.weight(1-10000)设置CPU分配权重;cpu.max以"$PERIOD $QUOTA"格式设置硬上限;memory.max设置内存硬限制(超出触发OOM);memory.high设置软限制(超出触发回收但不OOM);io.max按设备号限速bps和iops;pids.max限制最大进程数防止fork bomb。PSI(Pressure Stall Information,4.20+引入)提供资源争用的精确监控指标——跟踪CPU/内存/IO三种压力,支持可配置阈值触发(如"60秒内超过10%的任务因内存争用阻塞"时触发事件通知),实现主动式资源管理。
三、UnionFS:容器镜像的分层魔法
OverlayFS(3.18并入内核,当前默认存储驱动)使用两层模型:lowerdir(只读底层多层合并)、upperdir(可写顶层)、merged(容器看到的根文件系统)。核心行为是copy-up:修改lowerdir中的文件时,OverlayFS将整个文件复制到upperdir再修改——以文件为单位而非字节为单位。删除操作通过whiteout文件标记下层文件隐藏。驱动选择对比:Device Mapper基于块设备COW(RHEL默认);Btrfs利用原生subvolume/snapshot;OverlayFS因简单高效成为主流选择。
四、安全与生产实践
runc是OCI Runtime Spec参考实现,工作流程:解析spec → unshare各Namespace → setns进入 → pivot_root切换根 → 设置cgroup → 配置Capabilities和seccomp → sethostname → exec启动进程。主流容器网络方案:VXLAN Overlay(Flannel)、BGP路由(Calico,无封装开销)、eBPF数据面(Cilium,高性能网络策略)。安全加固叠加层:Capabilities(拆分超级权限为独立单元)、Seccomp(系统调用白名单)、AppArmor/SELinux(强制访问控制)、Rootless模式(podman原生支持不依赖宿主机root运行)。生产经验:对IO敏感容器(数据库等)使用volume挂载绕过overlay copy-up;不设置limit导致的"noisy neighbor"是集群最常见不稳定因素;推荐将应用作为PID 1直接运行,通过tini等轻量init收割僵尸进程。

发表评论 取消回复