Namespace 隔离机制
Namespace 是 Linux 容器隔离的基础,下面深入分析六种 Namespace 原理。
六种 Namespace
| Namespace | 宏 | 隔离内容 | 内核版本 |
|---|---|---|---|
| PID | CLONE_NEWPID | 进程号 | 2.6.24 |
| NET | CLONE_NEWNET | 网络栈 | 2.6.29 |
| IPC | CLONE_NEWIPC | 进程间通信 | 2.6.19 |
| MNT | CLONE_NEWNS | 文件系统挂载点 | 2.4.19 |
| UTS | CLONE_NEWUTS | 主机名和域名 | 2.6.19 |
| USER | CLONE_NEWUSER | 用户和组 ID | 3.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
📝 发现内容有误?点击此处直接编辑