一、简介

Linux Namespace 是 Linux 提供的一种内核级别环境隔离的方法。不知道你是否还记得很早以前的 Unix 有一个叫 chroot 的系统调用(通过修改根目录把用户 jail 到一个特定目录下),chroot 提供了一种简单的隔离模式:chroot 内部的文件系统无法访问外部的内容。Linux Namespace 在此基础上,提供了对 UTS、IPC、mount、PID、network、User 等的隔离机制。

举个例子,我们都知道,Linux 下的超级父亲进程的PID是1,所以,同 chroot 一样,如果我们可以把用户的进程空间 jail 到某个进程分支下,并像 chroot 那样让其下面的进程 看到的那个超级父进程的 PID 为1,于是就可以达到资源隔离的效果了(不同的 PID namespace 中的进程无法看到彼此)

Linux Namespace的6大类型

类型 功能说明
Mount Namespace 提供磁盘挂载点和文件系统的隔离能力
IPC Namespace 提供进程间通信的隔离能力
Network Namespace 提供网络隔离能力
UTS Namespace 提供主机名隔离能力
PID Namespace 提供进程隔离能力
User Namespace 提供用户隔离能力

二、Mount Namespace

Mount namespace 让容器看上去拥有整个文件系统。

容器有自己的 / 目录,可以执行 mount 和 umount 命令。当然我们知道这些操作只在当前容器中生效,不会影响到 host 和其他容器。

三、IPC Namespace

IPC 全称 Inter-Process Communication,是 Unix/Linux 下进程间通信的一种方式,IPC 有共享内存、信号量、消息队列等方法。所以,为了隔离,我们也需要把IPC给隔离开来,这样,只有在同一个 Namespace 下的进程才能相互通信。IPC 需要有一个全局的 ID,即然是全局的,那么就意味着我们的 Namespace 需要对这个 ID 隔离,不能让别的 Namespace 的进程看到。

四、Network Namespace

Network namespace 让容器拥有自己独立的网卡、IP、路由等资源。

五、UTS Namespace

简单的说,UTS namespace 让容器有自己的 hostname。 默认情况下,容器的 hostname 是它的短ID,可以通过 -h 或 --hostname 参数设置。

六、PID Namespace

容器在 host 中以进程的形式运行。例如当前 host 中运行了一个容器:

通过 ps axf 可以查看容器进程:

所有容器的进程都挂在 dockerd 进程下,同时也可以看到容器自己的子进程。 如果我们进入到某个容器,ps 就只能看到自己的进程了。

而且进程的 PID 不同于 host 中对应进程的 PID,容器中 PID=1 的进程当然也不是 host 的 init 进程。也就是说:容器拥有自己独立的一套 PID,这就是 PID namespace 提供的功能。

七、User Namespace

User namespace 让容器能够管理自己的用户,host 不能看到容器中创建的用户。