人人都会AI编程

PID、Mount、Network、UTS、IPC、User 六大命名空间

更新时间:2026-07-12

Linux 命名空间(namespace)是容器隔离技术的核心机制,它让运行在同一物理内核上的多个进程组,各自以为自己独占一套独立的系统资源。每个命名空间都负责隔离一类特定的全局资源,从而确保一个容器内的操作不会干扰到宿主机或其他容器。下面逐一说明六种最重要的命名空间。


1. PID 命名空间

隔离进程编号。每个 PID 命名空间都拥有独立的进程 ID 体系,容器内看到的第一个进程总是 PID 1,而它在宿主机上可能对应 PID 24891。这种隔离意味着:

  • 容器内无法看到或向宿主机上其他容器的进程发送信号;
  • 容器内可以干净地实现“停止容器等于杀死 PID 1 及其子进程树”的生命周期管理;
  • ps aux 在不同命名空间里看到的列表完全不同。

实用命令示例:lsns -t pid 可以查看当前系统中所有 PID 命名空间。


2. Mount 命名空间

隔离文件系统挂载点。Mount 命名空间为进程提供独立的文件系统视图,一个命名空间内执行的 mountumount 操作,不会影响主机或其他命名空间。这是容器拥有独立根文件系统的关键:

  • 容器启动时,可以通过 pivot_rootchroot 切换到一个全新的文件系统树;
  • 可以在容器内挂载 tmpfs/proc/sys 等而不泄露到宿主机;
  • Docker 的“镜像层”与“容器层”联合挂载(OverlayFS)也依赖 Mount 命名空间。

通过 /proc/<pid>/mountinfo 可以查看某进程的挂载视图。


3. Network 命名空间

隔离网络栈。每个 Network 命名空间拥有独立的网卡(虚拟或物理)、IP 地址、路由表、防火墙规则(iptables/nftables)和端口号空间。这意味着:

  • 同一个端口(如 80)可以分别在宿主机、容器 A 和容器 B 中同时监听,互不冲突;
  • 可以通过虚拟以太网对(veth pair)将容器命名空间连接到宿主机桥接或虚拟交换机;
  • Docker 默认的 bridge 网络模式就是为一个容器创建独立的 Network 命名空间。

常用命令:ip netns list 显示命名的网络命名空间;ip netns exec <ns> <command> 可以在指定命名空间中执行网络命令。


4. UTS 命名空间

隔离主机名和域名。UTS(Unix Timesharing System)命名空间让容器可以拥有自己独立的 hostnamedomainname,在容器内执行 hostname webserver 不会改变宿主机的名称。这对于辨识容器身份、日志标记和某些应用配置非常重要,尤其是在多个实例同时运行时。

查看当前 UTS 命名空间可以比较 /proc/self/ns/uts 的 inode 号,不同容器指向不同的对象。


5. IPC 命名空间

隔离进程间通信资源。IPC 命名空间隔离了 System V IPC 对象(消息队列、信号量、共享内存)和 POSIX 消息队列。两个不同 IPC 命名空间的进程无法互相访问对方的共享内存段或信号量,从而防止一个容器有意或无意地干扰或窃取其他容器的 IPC 数据。例如,容器内 PostgreSQL 使用的共享内存段,不会暴露给另一个容器或主机的进程。


6. User 命名空间

隔离用户和组 ID 映射。这是安全隔离中至关重要的一环。User 命名空间允许一个进程在命名空间内是 root(UID 0),而在宿主机上只是一个无权普通用户(如 UID 1000)。这种映射机制打破了“容器内 root 等于主机 root”的危险等式,大幅降低了容器逃逸带来的破坏。例如,即使容器内进程以 root 身份运行,它在宿主文件系统上执行的写入操作,也只会按照映射后的普通用户权限进行。Docker 默认未启用 User 命名空间(称为 userns-remap 模式),但在强化安全的环境下通常会开启。


组合使用的实际效果

这六大命名空间并不是独立存在的,它们在创建容器时被同时启用,从而共同营造出一个进程既视感“完整独立系统”的沙箱。例如,当你运行 docker run -it ubuntu bash 时,Docker 会为这个容器创建:

  • PID 命名空间,你看到 bash 是 PID 1;
  • Mount 命名空间,你看到的是 Ubuntu 镜像层构成的根文件系统;
  • Network 命名空间,拥有一个独立的 eth0 和容器 IP;
  • UTS 命名空间,容器内部主机名可能是随机的容器 ID 或指定的主机名;
  • IPC 命名空间,阻止与宿主机共享信号量等;
  • (可选)User 命名空间,将容器内的 root 映射主机普通 UID。

掌握这六种命名空间,你就能真正理解容器“轻量级虚拟化”的本质:它不是模拟硬件,而是利用内核特性为进程划分出独立的系统资源视图,从而在共享同一操作系统的前提下实现安全和高效的隔离。