Namespace 隔离
什么是 Namespace
Namespace(命名空间)是 Linux 内核提供的一种资源隔离机制,它将全局的系统资源包装在抽象的命名空间中,使得命名空间内的进程只能看到自己空间内的资源。这是 Docker 容器的核心隔离技术。
容器的 6 种 Namespace
Docker 创建容器时为每个容器创建独立的命名空间:
| Namespace | 隔离的资源 | Docker 中用途 |
|---|---|---|
| PID | 进程 ID | 容器内只有自己的进程 |
| Network | 网络设备、协议栈 | 每个容器有自己的网络栈 |
| Mount | 文件系统挂载点 | 容器有独立的文件系统视图 |
| UTS | 主机名和域名 | 容器可以设置自己的 hostname |
| IPC | System V IPC | 防止跨容器进程通信 |
| User | 用户和组 ID | 容器内 root 映射到宿主机非特权用户 |
各 Namespace 详解
PID Namespace
# 宿主机 PID 空间
$ ps aux | grep nginx
root 1234 ... nginx
# 容器内 PID 空间
$ docker exec web ps aux
PID USER COMMAND
1 root nginx: master process
7 101 nginx: worker process
容器内的进程 1(PID=1)在宿主机上是 PID 1234。容器看不到宿主机或其他容器的进程。
Network Namespace
每个容器有自己的网络栈,包括网卡、路由表、iptables 规则等。通过 veth pair(虚拟以太网对)将容器网络连接到 Docker bridge。
Mount Namespace
容器有独立的文件系统挂载点视图。容器无法看到宿主机的文件系统(除了挂载的卷)。
UTS Namespace
每个容器可以有独立的主机名。
IPC Namespace
默认容器间 IPC 隔离。
User Namespace
将容器内的 root(UID 0)映射为宿主机上的非特权用户:
# 配置 Docker 守护进程启用 userns-remap
echo '{"userns-remap": "default"}' >> /etc/docker/daemon.json
systemctl restart docker
# 现在容器内的 root 在宿主机上是普通用户
Namespace 操作
# 查看进程的命名空间
ls -la /proc/$$/ns/
# 比较容器和宿主机的命名空间
docker inspect --format '{{.State.Pid}}' container_name
nsenter -t -n ip addr # 进入容器的网络命名空间
共享 Namespace 的场景
# 共享网络 namespace(sidecar 模式)
docker run --net=container:web-app network-debug
# 和 web-app 共享网络栈
# 共享 PID namespace
docker run --pid=container:web-app sidecar
# sidecar 可以看到 web-app 的进程
安全建议
- 默认隔离:Docker 默认为所有 6 种 Namespace 创建隔离
- 避免 –privileged:会关闭所有 Namespace 隔离
- 启用 User Namespace:使用
userns-remap增强隔离 - 谨慎共享 Namespace:
--net=host会降低隔离性
Namespace 是容器安全的基石,理解它的工作原理有助于正确配置容器安全策略。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容