目前docker完成6项隔离
namespace | 系统调用参数 | 隔离内容 |
UTS | CLONE_NEWUTS | 主机名与域名 |
IPC | CLONE_NEWIPC | 信号量,消息队列,共享内存 |
PID | CLONE_NEWPID | 进程编号 |
Network | CLONE_NEWNET | 网络设备,网络栈,端口等 |
Mount | CLONE_NEWNS | 挂载点(文件系统) |
User | CLONE_NEWUSER | 用户和用户组 |
Linux 内核3.8及以后的版本
namespace 的API包括
clone()
setns()
unshare()
Mount namespace:
隔离文件系统挂载点,每个进程能看到的文件系统都记录在/proc/$$/mounts里,
UTS namespace:
使每个docker拥有独立的主机名和域名,在网络上可以被视为一个独立的节点,而非宿主机的一个进程
IPC namespace:
涉及到的IPC资源有包括常见的信号量,消息队列和共享内存,容器和宿主机,容器与容器之间,容器与宿主机之间隔离
PID namespace:
对进程PID重新标号,两个不同的namespace下的进程可以有相同的PID,内核中为所有的PID维护了一个树状结构,最顶层的是系统初始时建立的即root namespace,它创建的新PID namespace被称为child namespace(树的子节点),通过这种方式,不同的PID namespace会形成一个层级体系,所有的父节点可以看到子节点中的进程,并通过信号的方式对子节点中的进程产生影响,但是子节点看不到父节点PID namespace中的任何内容
Nework namespace:
对网络相关资源进行隔离,每个network namespace都有自己的网络设备,IP地址,路由表,/proc/net 目录,端口号等, 有了网络隔离,比如有两个容器的web应用都是用了80端口,因为隔离就不会冲突
User namespace:
隔离用户和组ID,也就是说一个进程在namespace里和用户和组ID可以和它在host里的ID可以不一样,