个人随笔
目录
容器技术所涉及的Linux内核关键技术详解(Namespace资源隔离、Cgroups资源管控)
2026-06-27 17:51:51
容器技术是当下云原生、微服务、DevOps的核心基石,其本质是依托Linux内核的隔离与资源管控能力,实现轻量级虚拟化。不同于虚拟机,容器无需完整操作系统镜像,仅隔离进程、资源与网络,具备启动快、占用资源少、部署灵活的优势。本文将从容器技术发展历程、Namespace资源隔离、Cgroups资源管控三大核心维度,系统性拆解容器底层内核原理,并搭配完整实操案例,助力透彻理解容器核心底层逻辑。

一、容器技术的前世今生

chroot是UNIX系统推出的基础隔离技术,也是所有容器隔离能力的源头。其核心作用是变更进程的根目录,将指定进程的文件系统访问范围限制在新的目录路径中,实现单进程磁盘空间隔离
该技术仅针对文件系统做隔离,无网络、进程、资源管控能力,隔离能力极其有限,但奠定了容器“资源隔离”的核心思想。1982年,chroot功能正式被集成到BSD系统中,被广泛沿用。

1.2 2000年:FreeBSD Jails——全方位系统隔离雏形

由Derrick T. Woolworth研发的FreeBSD Jails,在chroot文件系统隔离的基础上,新增了进程、用户、网络资源的沙箱隔离机制,是首个多维度资源隔离的容器技术。
其核心特性:可为每个独立的Jail环境分配专属IP、定制化软件环境与配置,实现近乎独立的系统运行环境,彻底摆脱chroot仅能隔离目录的局限。

1.3 2001年:Linux VServer——系统分区资源安全管控

Linux VServer属于Jails类隔离机制,聚焦于服务器多分区的资源安全隔离。它可对系统的文件系统、CPU时间片、内存、网络地址等核心资源进行分区隔离与保护。
技术概念:系统的每个隔离分区被称为安全上下文,每个分区内的独立运行系统,即为虚拟私有服务器,实现了服务器资源的精细化分割。

1.4 2004年:Solaris容器——统一内核的虚拟化隔离

Solaris容器首次亮相于2004年2月的Solaris 10 Beta版本,2005年随正式版上线,支持x86与SPARC双架构。
核心优势:将系统资源控制与分区隔离边界深度结合,基于单一操作系统内核,创建多个完全隔离的虚拟服务器环境,所有隔离分区共享同一个内核,轻量化特性显著。

1.5 2005年:OpenVZ——Linux原生全维度隔离

OpenVZ技术理念与Solaris容器高度契合,通过打补丁的Linux内核,实现完整的虚拟化、资源隔离、资源管理与检查点交付能力。
它实现了容器环境的全资源隔离:每个OpenVZ容器拥有独立的文件系统、用户/用户组、进程树、网络栈、设备及IPC进程通信对象,隔离完整性大幅提升。

1.6 2006年:Process容器(Cgroups前身)

谷歌2006年推出Process容器,核心作用是限制、分配、隔离进程组的资源使用,管控范围涵盖CPU、内存、磁盘IO、网络等核心资源。
为避免与Linux内核其他术语冲突,该技术后续正式更名为Control Groups(控制组,Cgroups),是谷歌对容器资源管控的核心奠基贡献。

1.7 2007年:Control Groups 并入Linux内核

谷歌实现的Cgroups技术在2007年正式合并到Linux主线内核,为后续容器技术的资源配额、资源限制、进程管控提供了核心内核能力,成为容器技术的两大核心支柱之一(另一核心为Namespace)。

1.8 2008年:LXC——首个完整Linux容器实现方案

LXC(Linux Containers)是业界第一套完整、成熟的Linux容器管理方案,依托Cgroups资源管控 + Namespace资源隔离两大内核能力实现。
核心特性:
  • 基于原生Linux内核运行,无需额外打补丁,兼容性极强;
  • 通过liblxc库提供底层能力,支持Python、Go、Ruby、Lua等多语言API对接;
  • 整合隔离与资源管控能力,实现了开箱即用的容器虚拟化环境。

1.9 2011年:Warden——跨平台容器管理方案

由CloudFoundry公司研发,初期基于LXC实现,后续自研底层替代LXC,摆脱了对Linux系统的强耦合。
核心优势:支持跨操作系统运行,只要系统具备资源隔离能力即可适配;以守护进程方式运行,通过API提供标准化的容器管理能力,为云原生容器编排提供了思路。

1.10 2013年:LMCTFY——谷歌开源容器堆栈

LMCTFY全称 Let Me Contain That For You,是谷歌开源的Linux应用容器技术栈,主打高性能、高资源利用率、低损耗的容器运行能力。
2013年10月发布首个版本,2015年谷歌将其核心抽象能力与接口规范剥离,迭代为libcontainer项目,LMCTFY后续停止迭代,逐步退出技术生态。

1.11 2013年:Docker——容器技术标准化里程碑

2013年Docker正式开源发布,初期基于LXC实现,核心价值是简化容器操作、标准化容器生态。它将LXC复杂的底层操作封装为简洁易懂的命令体系,大幅降低了容器使用门槛。
后续Docker持续迭代,突破LXC底层限制,将底层容器能力抽象为libcontainer标准接口。只要适配该接口,Namespace、Cgroups、systemd等任意底层实现均可支撑Docker运行,实现了容器底层解耦与跨平台能力,最终推动容器技术大规模普及。目前libcontainer已归入开放容器基金会管理,成为行业标准。

二、Namespace:Linux内核资源隔离核心技术

Namespace(命名空间)是Linux内核实现资源隔离的核心机制,也是容器实现“独立系统环境”的基础。其核心思想是对系统全局资源进行封装隔离,不同命名空间的进程相互不可见、互不干扰,让容器进程误以为自己运行在独立的操作系统中。

2.1 Namespace核心原理

  • 通用命名空间:编程语言中的命名空间用于代码隔离、封装;
  • Linux内核命名空间:用于系统硬件/软件资源隔离,涵盖进程、网络、文件系统、用户、主机名等资源;
  • 容器隔离逻辑:同一命名空间内的进程可相互感知、通信,跨命名空间进程完全隔离,无任何交互,最终实现轻量级虚拟化。

2.2 Linux六大核心Namespace分类

Linux内核提供6种核心命名空间,全方位覆盖容器所需的隔离能力,具体能力如下表所示:
命名空间类型
隔离对象
核心作用
关键备注
进程命名空间(PID)
进程ID
不同命名空间中,同一进程拥有不同PID,实现进程隔离
采用父子层级结构,子命名空间对父命名空间可见
网络命名空间(NET)
网络设备、协议栈、端口、路由、防火墙
实现容器网络完全隔离,每个容器拥有独立网络栈
Docker通过虚拟网卡对(veth)实现不同命名空间网络互通
IPC命名空间
进程间通信资源
隔离进程间消息队列、信号量等交互资源
可与PID命名空间配合使用,仅同命名空间进程可交互
挂载命名空间(MNT)
文件系统挂载点、目录结构
隔离容器文件目录,实现独立文件系统环境
能力强于chroot,安全性更高,支持动态挂载隔离
UTS命名空间
主机名、NIS域名
让容器拥有独立主机名与域名,模拟独立主机环境
实现容器主机信息与宿主机完全隔离
用户命名空间(USER)
用户ID、用户组ID
容器内用户ID与宿主机用户ID隔离,权限独立
不同命名空间可存在相同UID/GID,互不冲突,提升容器安全性

2.3 核心实操案例:网络命名空间(NET)

网络命名空间是容器网络隔离的核心,每个网络命名空间拥有独立的网卡、路由表、iptables规则、套接字等完整网络栈。以下为完整实操命令,可直观验证网络隔离与互通原理。

2.3.1 创建网络命名空间

# 创建名为msb的网络命名空间
ip netns add msb

# 查看所有已创建的网络命名空间
ip netns ls

2.3.2 删除网络命名空间

# 删除指定网络命名空间
ip netns delete msb

2.3.3 进入网络命名空间执行命令

# 进入msb命名空间,开启bash终端(exit退出)
ip netns exec msb bash

2.3.4 查看命名空间网卡信息

# 命名空间内查看网卡
ip link

# 宿主机直接查看指定命名空间网卡
ip netns exec msb ip link list

2.3.5 退出网络命名空间

# 退出当前命名空间终端
exit

2.3.6 查看命名空间网络资源

# 查看命名空间路由表
ip netns exec msb route -n

# 查看命名空间防火墙nat规则
ip netns exec msb iptables -t nat -nL

2.3.7 创建虚拟网卡对(veth)

虚拟网卡对是实现跨命名空间网络互通的核心,两端网卡可分别归属不同命名空间。
# 创建veth0、veth1虚拟网卡对
ip link add veth0 type veth peer name veth1

# 查看宿主机虚拟网卡
ip a s

2.3.8 迁移虚拟网卡至命名空间

# 将veth1迁移至msb网络命名空间
ip link set veth1 netns msb

# 查看命名空间内网卡信息
ip netns exec msb ip link

2.3.9 删除命名空间内虚拟网卡

# 删除msb命名空间内的veth1网卡
ip netns exec msb ip link delete veth1

# 验证删除结果
ip netns exec msb ip link

2.3.10 配置网卡IP并实现互通

# 1. 重新创建虚拟网卡对并迁移网卡
ip link add veth0 type veth peer name veth1
ip link set veth1 netns msb

# 2. 为命名空间内veth1配置IP
ip netns exec msb ip addr add 192.168.50.2/24 dev veth1

# 3. 启用命名空间内网卡与回环地址
ip netns exec msb ip link set veth1 up
ip netns exec msb ip link set lo up

# 4. 为宿主机veth0配置IP并启用
ip addr add 192.168.50.3/24 dev veth0
ip link set veth0 up

# 5. 宿主机ping容器命名空间网卡(互通验证)
ping 192.168.50.2

# 6. 容器命名空间ping宿主机网卡(互通验证)
ip netns exec msb ping 192.168.50.3

# 7. 配置默认路由,实现外网访问
ip netns exec msb ip route add default via 192.168.50.3
补充:如需容器访问外网,可通过开启宿主机路由转发、配置iptables SNAT规则实现。

三、CGroups:Linux内核资源管控核心技术

如果说Namespace实现了容器的资源隔离,那么CGroups(Control Groups,控制组)就实现了容器的资源限制与管控。CGroups是Linux内核原生机制,可对进程组的CPU、内存、磁盘IO、网络等资源进行限制、统计与调度,是容器稳定运行的核心保障。

3.1 CGroups核心介绍

CGroups是Linux内核提供的轻量级资源管控机制,核心作用是对一组进程进行统一的资源配额限制、优先级分配、资源统计与生命周期控制。可以说,没有CGroups,容器就无法实现资源配额管控,会出现单容器抢占整机资源的问题

3.2 CGroups四大核心功能

  • 资源限制:限定进程组最大资源使用量,如内存上限、CPU使用率上限,超出阈值触发OOM或限流,避免资源耗尽;
  • 优先级分配:通过调整CPU时间片、磁盘IO带宽权重,控制不同进程组的运行优先级,保障核心业务资源;
  • 资源统计:精准统计进程组的CPU占用时长、内存使用量、IO读写次数等数据,适用于资源计费、性能监控;
  • 进程控制:支持对进程组批量执行挂起、恢复、终止等操作,简化容器进程管理。

3.3 CGroups实操案例:限制进程CPU资源

本次实操通过CGroups CPU子系统,创建两个权重不同的资源分组,验证CPU资源的优先级分配与限流效果。

3.3.1 安装并启动CGroups服务

# 安装cgroups管理工具
yum -y install libcgroup

# 启动并设置开机自启
systemctl start cgconfig.service
systemctl enable cgconfig.service

3.3.2 查看CGroups子系统与CPU配置

# 查看所有可用资源子系统
lssubsys

# 查看cpu子系统配置文件目录
ls /sys/fs/cgroup/cpu

# 查看默认CPU权重(默认1024)
cat /sys/fs/cgroup/cpu/cpu.shares
cpu.shares 代表CPU权重,数值越高,分配的CPU时间片越多,优先级越高。

3.3.3 配置CPU资源分组

编辑配置文件,创建两个权重差异的分组:lesscpu(低权重)、morecpu(高权重)。
# 编辑cgroups配置文件
vim /etc/cgconfig.conf

# 写入以下配置
group lesscpu {
 cpu{
  cpu.shares=200;
     
group morecpu {
              ares=800;
     

# 重启服务生效
systemctl restart cgconfig   }        
} cpu.sh         cpu{
   }        
}                     

3.3.4 编写压测脚本

编写死循环脚本,持续占用CPU资源,用于压测验证。
#!/bin/bash
a=1
while true
do
        a=$[$a+1]
done

3.3.5 绑定进程至指定分组并验证

需要开启三个终端配合验证(单CPU机器效果最佳):
# 终端1:低权重分组运行压测脚本
cgexec -g cpu:lesscpu sh /tmp/1.sh

# 终端2:高权重分组运行压测脚本
cgexec -g cpu:morecpu sh /tmp/1.sh

# 终端3:查看CPU占用情况
top
效果验证:morecpu分组进程CPU占用远高于lesscpu,权重差异直接决定资源分配比例。
多CPU机器适配方案(屏蔽多核干扰):
# 查看CPU核心数
lscpu

# 仅保留cpu0核心在线,关闭其他核心
echo 0 > /sys/devices/system/cpu/cpu1/online
echo 1 > /sys/devices/system/cpu/cpu0/online

四、总结

容器技术的核心底层逻辑,完全依托Linux内核两大核心能力:Namespace负责资源隔离,打造独立容器环境;CGroups负责资源管控,保障系统稳定性。数十年的技术迭代,从chroot简单目录隔离,到Docker标准化容器生态,本质是内核隔离与管控能力的持续完善。掌握这两大内核技术,是理解Docker、K8s等云原生技术的核心基础。
 5

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2