前言
上一篇文章我们聊到,Linux 的命名空间(Namespaces)和控制组是 K8s 容器化的两大基石。其中命名空间就像给容器画了一个个 “独立结界”,让每个容器里的应用都以为自己独占一台服务器。
但你有没有想过:如果没有这个 “结界” 会怎样?当你同时启动两个 nginx 容器时,它们都会默认监听 80 端口,结果必然是端口冲突;容器里误删了/etc/hosts,宿主机的系统配置也跟着遭殃;查看进程时,宿主机和所有容器的进程混在一起,根本分不清谁是谁。
而命名空间正是为解决这些问题而生的。今天这篇文章就带大家逐一拆解 Linux 的 6 大命名空间,再通过unshare命令亲手打造一个简易容器,让你直观感受隔离的 “魔法”。
一、先搞懂:命名空间到底是什么?
Linux 命名空间是内核提供的一种进程隔离技术。它的核心思路是:对进程可见的系统资源进行 “分组隔离”,让同一命名空间内的进程只能看到本组的资源,看不到其他命名空间的资源。
打个比方,命名空间就像写字楼里的独立办公室。每个办公室(命名空间)里的人(进程)只能看到自己办公室的设备(资源),听不到其他办公室的声音,彼此互不干扰;而写字楼的管理员(Linux 内核)能看到所有办公室的情况,统一管理整栋楼的资源。
在容器技术中,每个容器其实就是一个或一组进程,被包裹在一套完整的命名空间中,从而实现和其他容器、宿主机的隔离。

二、逐一拆解:Linux 的 6 大核心命名空间
Linux 内核提供了 6 种命名空间,分别从进程、网络、文件系统等 6 个维度实现隔离。下面我们逐个剖析,结合通俗解释和实操验证,让你彻底搞懂每个命名空间的作用。

2.1 PID Namespace:进程 ID 的 “独立编号本”
核心作用
隔离进程 ID(PID)。同一命名空间内的进程有独立的 PID 编号序列,不同命名空间的 PID 可以重复,互不影响。
通俗理解
就像两个班级的学生都有 “学号 1” 一样,PID Namespace 让每个容器里都能有PID=1的进程(通常是容器的初始化进程),但这个 PID 在宿主机上会是另一个完全不同的编号。
实操验证
- 启动一个容器,进入容器终端查看进程:
bash
预期结果:容器内仅显示# 启动busybox容器 docker run -it --rm busybox /bin/sh # 容器内查看进程,PID=1的是/bin/sh psPID=1的/bin/sh进程,看不到宿主机的其他进程。 - 打开宿主机新终端,查找该容器对应的宿主机进程:
bash
预期结果:会看到容器进程在宿主机上的 PID(比如# 查找busybox相关进程 ps aux | grep busybox1234),和容器内的PID=1完全不同。
2.2 Network Namespace:网络的 “独立小局域网”
核心作用
隔离网络资源,包

1189

被折叠的 条评论
为什么被折叠?



