Linux实现了六种不同类型的命名空间,每个命名空间的目的是将一个特定的全局系统资源包裹在一个抽象中,使命名空间内的进程看起来它们拥有自己的全局资源的孤立实例。命名空间的总体目标之一是支持容器的实现,容器是一种轻量级虚拟化的工具(以及其他目的),它为一组进程提供了一种错觉,即它们是系统上唯一的进程。

    1. Mount Namespace隔离了一组进程所看到的文件系统挂载点的集合,因此,在不同Mount Namespace的进程看到的文件系统层次结构也不同。
    2. UTS Namespace隔离了uname()系统调用返回的两个系统标示符nodename和domainname,在容器的上下文中,UTS Namespace允许每个容器拥有自己的hostname和NIS domain name,这对于初始化和配置脚本是很有用的,这些脚本根据这些名称来定制它们的操作。
    3. IPC Namespace隔离了某些IPC资源(interprocess community,进程间通信),即System V IPC和POSIX消息队列,这些IPC机制的共同特点是,IPC对象由文件系统路径名以外的机制来识别。每个IPC命名空间都有自己的一套System V IPC标识符和自己的POSIX消息队列文件系统。
    4. PID Namespace隔离了进程ID号空间,不同的PID Namespace中的进程可以拥有相同的PID。PID Namespace的好处之一是,容器可以在主机之间迁移,同时容器内的进程保持相同的进程ID。PID命名空间还允许每个容器拥有自己的init(PID 1),它是 “所有进程的祖先”,负责管理各种系统初始化任务,并在子进程终止时收割孤儿进程。
      从特定的PID Namespace实例来看,一个进程有两个PID:Namespace内的PID和主机系统上命名空间外的PID。PID命名空间可以嵌套:一个进程从它所在的PID Namespace一直到根PID Namespace,每一层的层次结构都有一个PID,一个进程只能看到他自己PID Namespace和嵌套在该PID Namespace下面的Namespace中包含的进程。
    5. Network Namespace提供了网络相关系统资源的隔离,因此,每个Network Namespace都有自己的网络设备、IP地址、IP路由表、/proc/net目录、端口号等。
      网络命名空间使得容器从网络的角度来看是很有用的:每个容器可以有自己的(虚拟)网络设备和自己的应用程序,并与每个命名空间的端口号空间绑定;主机系统中合适的路由规则可以将网络数据包引导到与特定容器相关联的网络设备。因此,例如,可以在同一个主机系统上拥有多个容器化的网络服务器,每个服务器都绑定到其(每个容器)网络命名空间的80端口。
    6. User Namespace隔离了用户和组ID号空间,一个进程的用户和组ID在用户命名空间内外可以是不同的,一个进程可以在用户命名空间外拥有一个正常的无权限用户ID,同时在命名空间内拥有一个(root权限)的用户ID。