欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

Docker 核心实现:Linux Namespace、Cgroups 与 Rootfs

发表于:|最后更新:|分类:云原生与微服务|阅读:7508 次

很多初学者常将容器误认为“轻量级虚拟机”,但从 Linux 内核视角看,根本不存在所谓的“容器”实体,它本质上只是受配额限制和空间隔离的特殊用户态进程。Docker 等容器引擎的核心实现依赖于 Linux 内核的三大支柱技术:1. 命名空间(Namespaces)—— 解决“看得到什么”的问题通过调用 clone() 系统调用并传入特定标志位,为进程创建独立的视图隔离:CLONE_NEWPID:进程树隔离(容器内进程看到自己是 PID 1)。CLONE_NEWNET:独立的网络协议栈、网卡接口、路由表与防火墙规则。CLONE_NEWNS:文件系统挂载点隔离。CLONE_NEWUTS、CLONE_NEWIPC、CLONE_NEWUSER:主机名、进程间通信与用户映射隔离。2. 控制组(Control Groups / Cgroups)—— 解决“能用多少”的问题Cgroups 提供对物理资源的使用配额限制、优先级分配与使用量度量。通过向 /sys/fs/cgroup/ 下对应的虚拟文件系统写入参数,可以精准限制容器最大可用内存(memory.limit_in_bytes)、CPU 时间分片配额(cpu.cfs_quota_us / cpu.cfs_period_us)以及磁盘 I/O 读写带宽,防止单个失控进程拖垮宿主机。3. 联合文件系统(UnionFS / OverlayFS)—— 镜像的基石 容器的 rootfs 利用写时复制(Copy-on-Write, CoW)技术将只读的基础镜像层(LowerDir)与可读写的工作层(UpperDir)联合挂载为统一的合并视图(MergedDir)。容器运行时对文件的修改全部沉淀在最顶层,这正是 Docker 镜像能够分层复用、秒级拉起的核心秘诀。