我的印象是 DinD 只是使用主机 docker 守护进程的一个技巧,但我最近读到这不是真的,它实际上是一个嵌套容器化。
我对它的机制感兴趣,Linux 如何管理命名空间、cgroup 卷和网络方面的层次结构。还涉及哪些系统调用。
提前致谢 :)
答案1
命名空间和cgroup
s 本质上是分层的。
命名空间:每个命名空间要么是其类型的根命名空间,要么具有父命名空间。进程可以通过使用系统调用CLONE_NEW*
的标志clone
或使用unshare
系统调用来创建一个新的命名空间,该命名空间将成为当前命名空间的子级。您可以使用unshare
该程序来使用系统调用unshare
,这非常简单。
cgroup
s:即使没有创建新的cgroup
命名空间,cgroup
它本身也是分层的,因为每个命名空间cgroup
要么是根cgroup
,要么有一个父命名空间cgroup
。父母的所有限制cgroup
都适用于孩子cgroup
。子进程下的所有进程也cgroup
属于父进程。cgroup
嵌套卷是可能的,因为文件系统是分层的,并且可以将一个文件系统挂载到另一个文件系统的目录中。通过使用新的命名空间,主机文件系统对来宾隐藏mount
。这可以嵌套,因为命名空间可以嵌套。
网络由命名空间处理net
,命名空间也可以嵌套。
其中许多事情都需要根命名空间中的功能,这可以通过使用标志运行容器来--privileged
实现