Docker原理解读
大家都知道Docker容器的本质是宿主机上的进程,Docker通过namespace实现了资源隔离,通过cgroup实现了资源限制,通过写时复制机制实现了高效的文件操作,那么更进一步namespace是怎样隔离?很多人估计非常茫然。
在linux内核提供了6种namespace隔离的系统调用,它们基本完成了容器所需要做的隔离,如下表所示:
namespace | 系统调用参数 | 隔离内容 |
UTS | CLONE_NEWUTS | 主机名与域名 |
IPC | CLONE_NEWIPC | 信号量、消息队列和共享内存 |
PID | CLONE_NEWPID | 进程编号 |
Network | CLONE_NEWNET | 网络设备、网络栈、端口等 |
Mount | CLONE_NEWNS | 挂载点(文件系统) |
User | CLONE_NEWUSER | 用户和用户组 |
下面我们就以上几种隔离展开说明:
1、UTS(UNIX Time-sharing System)namespace提供了主机名与域名的隔离,这样每个Docker就可以拥有独立的主机名和域名了,在网络上可以视为一个独立的节点,而非宿主机上的一个进程。Docker中,每个镜像基本都是以自身所提供的服务名称来命名镜像的hostname,且不会对宿主机产生影响。
2、进程间通信(Inter-Process Communication,IPC)涉及的IPC资源包括常见的信号量、消息队列和共享内存。申请IPC资源就是申请了一个全局唯一的32位ID,所以IPC namespace中实际上包含了系统IPC标识符以及实现POSIX消息队列的文件系统。在同一个IPC namespace下进程彼此可见,不同IPC namespaceg下的进程则互相不可见。
3、PID namespace对进程PID进行了重新标号,即两个不同namespace下的进程可以拥有相同的PID。第个PID namespace都有自己的计数器。内核 为所有的PID namespace维护了一个树状结构,最顶层的系统初始时创建的,被称做root namespace.它创建的新的PID namespace被称做child namespace,而原先的PID namespace称为新创建节点的parnet namespace。通过这种方式,不同的PID namesapce会形成一个层级体系。所属的父节点可以看到子节点中的进程,并可以通过信号等方式对子节点的进程产生影响,,反过来,子节点看不到父节点PID namespac中的任何内容。
(待续)
- 点赞
- 收藏
- 关注作者
评论(0)