Linux Namespace 是 Kernel 的一个功能,它可以隔离一系列的系统资源,比如 PID、User ID、Network等。

当前 Linux 一共实现了 6 种不同类型的 Namespace。

Namespace 类型 系统调用参数
UTS Namespace CLONE_NEWUTS
PID Namespace CLONE_NEWPID
User Namespace CLONE_NEWUSER
Mount Namespace CLONE_NEWNS
Network Namespace CLONE_NEWNET
IPC Namespace CLONE_NEWIPC

3 个系统调用

Namespace 的 API 主要使用如下 3 个系统调用:

  • clone() 创建新进程。根据系统调用参数来判断哪些类型的 Namespace 被创建,而且它们的子进程也会被包含到这些 Namespace 中。
  • unshare() 将进程移出某个 Namespace。
  • setns() 将进程加入到 Namespace 中。

UTS Namespace

UTS Namespace 主要用来 nodename 和 domainname 两个系统标识。在 UTS Namespace 里面,每个 Namespace 允许有自己的 hostname。

PID Namespace

PID Namespace 是用来隔离进程 ID 的。同样一个进程在不同的 PID Namespace 里可以拥有不同的 PID。

Mount Namespace

Mount Namespace 用来隔离各个进程看到的挂载点视图。在 Mount Namespace 中调用 mount() 和 umount() 仅仅只会影响当前 Namespace 内的文件系统,而对全局的文件系统是没有影响的。

User Namespace

User Namespace 主要是隔离用户的用户组 ID。也就是说,一个进程的 User ID 和 Group ID 在 User Namespace 内外可以是不同的。
比较常见的是,在宿主机上以一个非 root 用户运行创建一个 User Namespace,然后在 User Namespace 里面却映射成 root 用户。这意味着,这个进程在 User Namespace 里面有 root 权限,但是在 User Namespace 外面却没有 root 权限。

Network Namespace

Network Namespace 是用来隔离网络设备、IP 地址端口 等网络栈的 Namespace。

Network Namespace 可以让每个容器拥有自己独立的(虚拟的)网络设备,而且容器内的应用可以绑定
到自己的端口,每个 Namespace 内的端口都不会互相冲突。在宿主机上搭建网桥后,就能很方
便地实现容器之间的通信,而且不同容器上的应用可以使用相同的端口。

IPC Namespace

IPC Namespace 用来隔离 System V IPC 和 POSIX message queues。每一个 IPC Namespace 都有自己的 System V IPC 和 POSIX message queue 。