Linux 命名空间(namespace)是容器隔离技术的核心机制,它让运行在同一物理内核上的多个进程组,各自以为自己独占一套独立的系统资源。每个命名空间都负责隔离一类特定的全局资源,从而确保一个容器内的操作不会干扰到宿主机或其他容器。下面逐一说明六种最重要的命名空间。
1. PID 命名空间
隔离进程编号。每个 PID 命名空间都拥有独立的进程 ID 体系,容器内看到的第一个进程总是 PID 1,而它在宿主机上可能对应 PID 24891。这种隔离意味着:
- 容器内无法看到或向宿主机上其他容器的进程发送信号;
- 容器内可以干净地实现“停止容器等于杀死 PID 1 及其子进程树”的生命周期管理;
ps aux在不同命名空间里看到的列表完全不同。
实用命令示例:lsns -t pid 可以查看当前系统中所有 PID 命名空间。
2. Mount 命名空间
隔离文件系统挂载点。Mount 命名空间为进程提供独立的文件系统视图,一个命名空间内执行的 mount、umount 操作,不会影响主机或其他命名空间。这是容器拥有独立根文件系统的关键:
- 容器启动时,可以通过
pivot_root或chroot切换到一个全新的文件系统树; - 可以在容器内挂载
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)命名空间让容器可以拥有自己独立的 hostname 和 domainname,在容器内执行 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。
掌握这六种命名空间,你就能真正理解容器“轻量级虚拟化”的本质:它不是模拟硬件,而是利用内核特性为进程划分出独立的系统资源视图,从而在共享同一操作系统的前提下实现安全和高效的隔离。