作为Linux程序员,你一定听过Namespace和Cgroups——它们是Docker、K8s等容器技术的底层基石,也是面试中高频被问的核心考点。
很多人只会用容器,却搞不懂“容器为什么能隔离资源”“如何限制容器的CPU和内存”,甚至把Namespace和Cgroups混为一谈。
今天就带大家从底层拆解,用通俗的语言+极简实操,吃透Namespace隔离、Cgroups限制、UnionFS分层存储的核心逻辑,帮你夯实Linux进阶基础,面试不慌、工作不踩坑!
文章结构是不同的。
也就是说,我们可以在一个Namespace内挂载某个文件系统(如挂载U盘、本地下的文件,来配置Cgroups的资源限制(这也是Docker等容器工具底层的实现方式)。
3.3.1
CPU限制实操
需求:创建一个Cgroup,限制该Cgroup下的进程,最多只能使用1颗CPU的50%(即0.5颗CPU)。
#进入CPU
Cgroup
cd/sys/fs/cgroup/memory#创建一个名为my_memory的Cgroup
mkdirmy_memory#配置内存限制:最多使用100M内存(单位:字节,100M=104857600字节)
echo104857600>my_memory/memory.limit_in_bytes#Cgroup中
echo$$>my_memory/cgroup.procs#测试:运行一个占用内存的命令,超过100M会被系统杀死
python3-c"a
[1]*10000000"#
该命令会占用约80M内存(可正常运行)python3
-c"a
[1]*20000000"#
该命令会占用约160M内存(超过限制,会被杀死)
通过这个实操,我们可以直观地看到Cgroups的内存限制效果——当进程占用的内存超过设定的上限时,系统会自动终止该进程,避免过度占用内存。
3.4
Cgroups的核心特点
- 精细化控制:支持对CPU、内存、磁盘IO、网络等多种资源进行精细化限制;
- 进程组管理:可以将多个进程归为一个组,对整个组进行资源限制,方便管理;
- 灵活性:可以动态调整资源限制(无需重启进程),满足不同场景的需求;
- 兼容性:与Namespace完美协同,是容器技术的核心底层组件。
四、UnionFS:容器的“分层存储基石”
4.1
什么是UnionFS?
UnionFS(Union
File
System,联合文件系统)是一种「分层、可叠加的文件系统」,它的核心作用是:将多个独立的文件系统((层)叠加在一起,上层的相同文件,用户只能看到最上层的文件系统视图,但底层的所有目录(层)依然保持独立,互不修改。
这也是Docker镜像分层存储的核心原理——Docker镜像就是由多个只读层(layer)组成,当我们启动容器时,Docker会在镜像的只读层之上,添加一个可写层,容器内的所有修改(如创建、删除、修改文件),都会只发生在这个可写层,不会影响底层的只读镜像层,这样既能节省空间(多个容器可以共享同一套镜像只读层),又能保证镜像的一致性。
4.2
UnionFS的核心原理(分层叠加)
UnionFS的分层叠加机制,主要分为「只读层(Read-Only
Layer)」和「可写层(Read-Write
Layer)」,核心逻辑如下:
- 底层是多个只读层,这些层是固定不变的,只能读取,不能修改;
- 最上层是一个可写层,用户所有的写操作(创建、删除、修改文件),都会发生在这个可写层;
- 当用户读取一个文件时,UnionFS会从最上层的可写层开始查找,如果找到,就返回该文件;如果找不到,就依次向下查找只读层,直到找到为止;
- 当用户修改一个文件时,UnionFS会先从底层的只读层将该文件复制到最上层的可写层,然后在可写层对文件进行修改(即“写时复制”,Copy-On-Write),底层的只读层文件依然保持不变;
- 当用户删除一个文件时,UnionFS不会真正删除底层只读层的文件,而是在可写层创建一个“删除标记”,隐藏底层的文件,看起来像是删除了一样。
这种“写时复制”和“分层叠加”的机制,让UnionFS具备了两个核心优势:
- 空间高效:多个容器可以共享同一套只读镜像层,无需重复存储,极大节省了磁盘空间;
- 一致性:底层的镜像只读层不会被修改,确保了所有基于该镜像启动的容器,初始环境都是一致的。
4.3
常见的UnionFS变体(Docker常用)
UnionFS有多种变体,不同的变体在实现细节上略有差异,其中Docker常用的有以下3种:
- overlay2:目前Docker默认使用的UnionFS变体,性能优秀,支持多层叠加,兼容性好,是最推荐使用的变体;
- aufs:早期Docker使用的UnionFS变体,支持多层叠加,但性能略逊于overlay2,在部分Linux发行版中支持不够完善;
- devicemapper:一种基于块设备的存储驱动,不是严格意义上的UnionFS,但可以实现类似的分层存储功能,适合在不支持overlay2的系统中使用。
我们可以通过以下命令,查看Docker当前使用的存储驱动(即UnionFS变体):
dockerinfo|grep"StorageDriver"
五、总结:Namespace、Cgroups与UnionFS的协同关系
看到这里,相信大家已经对Namespace、Cgroups、UnionFS有了清晰的理解——这三者不是孤立的,而是协同工作,共同构成了容器技术的底层基石,它们的关系可以总结为:
- 「Namespace」负责「环境隔离」:让容器拥有独立的进程、网络、文件系统等环境,实现“进程看不到彼此”;
- 「Cgroups」负责「资源限制」:让容器只能使用设定的CPU、内存等资源,实现“进程不抢占资源”;
- 「UnionFS」负责「分层存储」:让容器拥有轻量、高效的存储方案,实现“镜像可复用、环境可一致”。
简单来说,三者的协同逻辑就是:用Namespace给容器“划一块独立的空间”,用Cgroups给容器“设定资源上限”,用UnionFS给容器“搭一套高效的存储”——三者结合,才让容器实现了“轻量、隔离、高效、可复用”的核心优势。
吃透这三个技术,不仅能让你轻松理解容器的底层逻辑,更能帮你夯实Linux内核基础,在排查底层问题、面试中都能占据优势。
建议大家收藏本文,跟着文中的实操步骤动手练习,加深理解~