linux内核具有6种不同的命名空间属性,分别提供了6种系统资源的隔离能力。被隔离的资源可以具备其中的一种或多种命名空间属性。

  • UTS Namespace 提供基于主机名的隔离能力

主机名隔离是指每个独立容器空间中的程序可以有各自不同的主机名称信息

  • PID Namespace  提供基于进程的隔离能力

进程隔离是的容器中的首个进程成为所在命名空间中PID 值为1 的进程

  • IPC Namespace  提供基于system V 进程信道的隔离能力

IPC全程 Inter-Process Communication ,是Linux 中的一种标准的进程间通信方式, 包括共享内存、信号量、消息队列等具体方法。

IPC隔离使得只有在同一命名空间下的进程才能相互通信。这一特性对于消除不同容器空间中进程的相互影响具有十分重要的作用。

  • MNT Namespace  提供基于磁盘挂在点和文件系统的隔离能力

这种隔离的效果与 chroot 系统调用十分相似,但从实际原理来看,MNT Namespace 会为隔离空间创建独立的Mount节点树,而chroot 仅仅是改变了当前上下文的根mount 节点位置,从而影响文件系统查找文件和目录的结果。

在文件系统隔离的作用下,容器中的进程将无法访问到容器以外的任何文件。在必要情况下,可以通过挂在额外目录的方式和主机共享文件系统。

  • User Namespace  提供基于系统用户的隔离能力

系统用户隔离是指用一个系统用户在不同的命名空间中可以拥有不同的UID和GID ,它们之间存在一定的映射关系。因此,在特定的命名空间中UID值为0的用户,并不一定是整个系统的root管理员用户。这一特性控制了容器用户的权限,有利于保护主机系统的安全。

  • Net Namespace  提供基于网络栈的隔离能力

网络栈的隔离允许使用者将特定的网卡与特定容器中的进程运行上下文关联起来,使得同一网卡在主机和容器中呈现不同的名称。

Net Namespace 的一个重要作用,是让每个容器通过命名空间来隔离和管理自己的网卡配置。因此可以创建一个普通的虚拟网卡,并将它作为特定容器运行环境的默认网卡eth0使用。

这些虚拟网络网卡最终可以通过某些方式(NAT、VxLan、SDN等)连接到实际的物理网卡上,从而实现像普通主机一样的网络通信。