全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-21 7 分钟 ✍️ juanwangdev

Namespace 隔离机制

Namespace 是 Linux 容器隔离的基础,下面深入分析六种 Namespace 原理。

六种 Namespace

Namespace隔离内容内核版本
PIDCLONE_NEWPID进程号2.6.24
NETCLONE_NEWNET网络栈2.6.29
IPCCLONE_NEWIPC进程间通信2.6.19
MNTCLONE_NEWNS文件系统挂载点2.4.19
UTSCLONE_NEWUTS主机名和域名2.6.19
USERCLONE_NEWUSER用户和组 ID3.8

PID Namespace

Bash
# 创建 PID Namespace
unshare --pid --fork /bin/bash

# 查看进程(仅看到 Namespace 内进程)
ps aux

# 输出
PID   COMMAND
1     /bin/bash
2     ps aux

每个 PID Namespace 有独立的进程树,容器内 PID 1 是容器进程。

NET Namespace

Bash
# 创建 NET Namespace
unshare --net /bin/bash

# 查看网络接口(仅 lo)
ip addr

# 输出
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN

每个 NET Namespace 有独立网络栈(接口、路由、iptables)。

MNT Namespace

Bash
# 创建 MNT Namespace
unshare --mount /bin/bash

# 挂载不影响宿主
mount -t tmpfs tmpfs /mnt

# 退出后挂载消失

MNT Namespace 实现文件系统隔离,容器看到不同文件系统视图。

UTS Namespace

Bash
# 创建 UTS Namespace
unshare --uts /bin/bash

# 修改主机名(不影响宿主)
hostname container-host

# 输出
container-host

IPC Namespace

Bash
# 创建 IPC Namespace
unshare --ipc /bin/bash

# 共享内存、消息队列、信号量隔离
ipcs -m

USER Namespace

Bash
# 创建 USER Namespace
unshare --user /bin/bash

# 容器内 root 映射为宿主非 root
id

# 输出
uid=0(root) gid=0(root)  # 容器内
# 实际映射为宿主 uid=100000

USER Namespace 实现 UID/GID 映射,容器 root 不对应宿主 root。

Docker 实现

Bash
# 查看容器 Namespace
docker inspect my-app | grep -A 10 "Namespace"

# 输出
"Pid": 1234,
"SandboxKey": "/var/run/docker/netns/abc123"

# 查看 Namespace ID
ls -l /proc/1234/ns/

# 输出
lrwxrwxrwx pid:[4026532456]
lrwxrwxrwx net:[4026532457]
lrwxrwxrwx mnt:[4026532458]

要点总结

  • PID Namespace 隔离进程号,容器内 PID 1 是容器进程
  • NET Namespace 隔离网络栈,独立接口和路由
  • MNT Namespace 隔离文件系统挂载点
  • UTS Namespace 隔离主机名和域名
  • IPC Namespace 隔离进程间通信
  • USER Namespace 映射 UID/GID,容器 root 不对应宿主 root

📝 发现内容有误?点击此处直接编辑

← 上一篇 Cgroups 资源控制
下一篇 → UnionFS 联合文件系统
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库