Docker原理解读

举报
Gordon_liu 发表于 2019/01/13 21:44:02 2019/01/13
【摘要】 大家都知道Docker容器的本质是宿主机上的进程,Docker通过namespace实现了资源隔离,通过cgroup实现了资源限制,通过写时复制机制实现了高效的文件操作,那么更进一步namespace是怎样隔离?很多人估计非常茫然。 在linux内核提供了6种namespace隔离的系统调用,它们基本完成了容器所需要做的隔离,如下表所示:namespace系统调用参数隔离内容UTSCLONE...

大家都知道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中的任何内容。

(待续)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。