最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Docker 架构中 Namespace 命名空间是如何实现资源隔离的
时间:2026-09-02 19:56:50 编辑:袖梨 来源:一聚教程网
Docker通过Linux内核Namespace实现资源隔离,本质是为容器提供独立资源视图而非禁止访问:PID Namespace使进程树互不可见;Network Namespace提供独享网络栈;MNT和UTS Namespace分别隔离文件系统与主机名;IPC和User Namespace强化通信安全与权限控制。
Docker 通过 Linux 内核的 Namespace 机制实现资源隔离,本质不是“禁止访问”,而是为每个容器创建一套独立的资源视图——容器内进程只能看到、操作属于自己的那一份资源副本,对其他容器或宿主机的同类资源完全无感知。
PID Namespace:进程树彼此不可见
每个容器启动时,Docker(实际由 runc)为其创建独立的 PID Namespace。容器内第一个进程 PID 恒为 1,它只能看到同 Namespace 内的子进程;宿主机上 ps aux 查到的所有进程、其他容器里的进程,在该容器内均不存在于 /proc 下。父 Namespace(如宿主机)默认可查看子 Namespace 进程,但需有权限且要通过特定接口(如 /proc/[pid]/status 中的 NSpid 字段)识别。
Network Namespace:独享网络栈
容器拥有专属的网卡(veth 设备)、IP 地址、路由表、iptables 规则和端口空间。Docker 默认使用 bridge 网络模式:为容器分配私有 IP,并通过 veth-pair 连接到宿主机的 docker0 网桥。这意味着容器 A 的 8080 端口与容器 B 的 8080 端口互不冲突,也不会与宿主机的 8080 冲突。用 docker run --network host 则跳过此隔离,直接复用宿主机 Network Namespace。
MNT 和 UTS Namespace:文件系统与主机名独立
MNT Namespace 隔离挂载点,使容器能拥有独立的根文件系统视图。Docker 结合 overlay2 等联合文件系统,将镜像只读层与容器可写层叠加后挂载进该 Namespace,实现“一份镜像、多个运行实例”的高效复用。UTS Namespace 则让每个容器可设置不同 hostname 和 domainname(如 docker run --hostname db-prod),在内部 uname -n 或 /etc/hostname 中生效,不影响宿主机或其他容器。
IPC、User Namespace:通信与权限加固
IPC Namespace 隔离 System V 信号量、共享内存及 POSIX 消息队列,防止容器间通过这些传统 IPC 方式意外互通。User Namespace 将容器内 UID/GID 映射到宿主机非特权范围(例如容器 root → 宿主机 100000),大幅降低提权风险。该功能默认关闭,需显式配置 --userns-remap 或 daemon 级启用。