Docker 的核心隔离技术之一:Namespace(命名空间)
Docker 容器之所以能“看起来像独立的系统”,最基础、最核心的机制就是 Linux Namespace(命名空间)。
简单来说:
Namespace 让同一个内核上的不同进程群,看起来拥有完全独立的全局资源视图。
Docker 主要使用的 6 种 Namespace(2025 年主流版本)
| Namespace 类型 | 隔离的内容 | 容器里看到的效果 | 典型体现 / 命令 | 是否默认启用 |
|---|---|---|---|---|
| PID | 进程 ID | 容器内 PID 从 1 开始,看不到宿主机其他进程 | ps aux 只看到容器内的进程 | 是 |
| UTS | 主机名 + 域名 | 容器有独立 hostname | hostname、domainname 独立 | 是 |
| MNT | 文件系统挂载点 / 根目录 | 拥有独立的 /(根文件系统) | mount、df -h 只看到容器自己的文件系统 | 是 |
| NET | 网络栈(网卡、IP、路由表、端口等) | 拥有独立的网络接口、IP、iptables规则 | ip addr、ifconfig、netstat 都是独立的 | 是 |
| IPC | 进程间通信(System V IPC、消息队列等) | 容器内 IPC 资源互相隔离,不受宿主机影响 | ipcs 只看到本容器 IPC 资源 | 是 |
| User | 用户和用户组(UID/GID) | 容器内 uid=0(root)不等于宿主机的 uid=0 | 容器内 root 权限很大,但对宿主机无实权 | 视情况(daemon 配置) |
(还有 cgroup namespace、time namespace 等较新的,但入门阶段一般不重点关注)
形象比喻(最容易理解的说法)
把 Namespace 想象成6副不同的眼镜:
- 戴上 PID 眼镜 → 只能看到自己这个房间里的人(进程)
- 戴上 NET 眼镜 → 只能看到自己这个房间的网线和 IP
- 戴上 MNT 眼镜 → 只能看到自己房间的家具和文件
- 戴上 UTS 眼镜 → 房间门牌写的是自己想要的名字
- ……
一个进程只要被放进这一整套“眼镜组合”里,它就觉得自己运行在一个独立的“小电脑”上 —— 这就是容器的“空间隔离”本质。
动手实验(强烈推荐自己敲一遍)
# 1. 进入一个 busybox 容器,看看隔离效果
docker run -it --rm busybox
# 在容器里执行下面命令,对比宿主机
hostname
ps aux
ip addr
mount | grep '^/'
whoami # 通常是 root
id # uid=0(root)
# 退出容器后,在宿主机上对比
# 2. 查看宿主机上容器的 namespace(需要 root 权限)
# 假设容器 ID 是 abc123
ls -l /proc/$(docker inspect abc123 -f '{{.State.Pid}}')/ns/
你会看到类似这样的输出:
total 0
lrwxrwxrwx 1 root root 0 Jan 24 17:30 cgroup -> cgroup:[402653XXXX]
lrwxrwxrwx 1 root root 0 Jan 24 17:30 ipc -> ipc:[402653XXXX]
lrwxrwxrwx 1 root root 0 Jan 24 17:30 mnt -> mnt:[402653XXXX]
lrwxrwxrwx 1 root root 0 Jan 24 17:30 net -> net:[402653XXXX]
lrwxrwxrwx 1 root root 0 Jan 24 17:30 pid -> pid:[402653XXXX]
lrwxrwxrwx 1 root root 0 Jan 24 17:30 user -> user:[402653XXXX]
lrwxrwxrwx 1 root root 0 Jan 24 17:30 uts -> uts:[402653XXXX]
数字相同的表示在同一个 namespace 里,不同的就实现了隔离。
总结一句话口诀(背下来很有用)
“六大命名空间,PID UTS MNT NET IPC User”
“进程、主机名、文件、网络、通信、用户全隔离”
下一步最该掌握的知识点(推荐顺序)
- Namespace 怎么实现的隔离(今天讲的)
- cgroups 怎么做资源限制(CPU/内存/IO)
- UnionFS / OverlayFS 怎么实现分层镜像
- Docker network 模式(bridge / host / none)
- user namespace 开启后带来的安全提升
有哪一部分想深入一点,或者想看某个 namespace 的更详细动手实验,可以直接告诉我~