Docker 内核技术原理之 Namespace

Docker 的空间隔离使用的是 namespace(命名空间),它是内核提供的一种空间隔离,在一个空间下,每个进程看到的视图是一致的,相应的如果不在一个空间下看到资源视图是不一致的。举个例子,如果两个进程在同一个网络命名空间下,那么他们看到的网络信息(网卡、IP、路由等)是一样的,可以通过 localhost 的方式互相访问。常用的有 6 种 namespace,在 Linux 内核 4.6 之后又添加了 Cgroup 这 namespace,5.6 之后又添加了时钟 namespace 。

这里有个小细节,上面表格创建 Mount Namespace 的系统调用参数是 CLONE_NEWNS,而不是 CLONE_NEWMOUNT。从字面理解是创建一个命名空间的意思,这是由于历史原因导致的,因为Mount Namespace 是第一个 namespace,内核的开发者可能也没有预料到后续还有其它的namespace 的加入,所以就先把 CLONE_NEWNS 给占用了。

可见,namespace 的隔离其实并不充分,除了上面的隔离能力,其他的都一样。譬如,时钟在内核 5.6 版本之前,所有容器和操作系统都共享同一个时钟,如果修改了操作系统的时间,所有容器都时间都会变化。

namespace 实现原理也非常简单,每个进程(task_struct)都有一个关于 namespace 的属性nsproxy,表示自己所属的 namespace。

struct task_struct { ...

/* namespaces */

struct nsproxy *nsproxy;

...

}

其中的 nsproxy 就是指向各种 namespace 的一个代理。如下所示: 

当新进程被创建后会继承其父进程的 namespace,这就是为啥一个容器里面的所有进程都共享 namespace。在 Linux 集群上面,通过读取“/proc/进程ID/ns/”下的文件可以获取到每个进程对应的namespace。 

作者:云技术趣谈
链接:https://os.51cto.com/art/202107/671347.htm
来源:51cto

(SAW:Game Over!)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值