dind(docker in docker)的底层机制

dind(docker in docker)的底层机制

我的印象是 DinD 只是使用主机 docker 守护进程的一个技巧,但我最近读到这不是真的,它实际上是一个嵌套容器化。

我对它的机制感兴趣,Linux 如何管理命名空间、cgroup 卷和网络方面的层次结构。还涉及哪些系统调用。

提前致谢 :)

答案1

命名空间和cgroups 本质上是分层的。

命名空间:每个命名空间要么是其类型的根命名空间,要么具有父命名空间。进程可以通过使用系统调用CLONE_NEW*的标志clone或使用unshare系统调用来创建一个新的命名空间,该命名空间将成为当前命名空间的子级。您可以使用unshare该程序来使用系统调用unshare,这非常简单。

cgroups:即使没有创建新的cgroup命名空间,cgroup它本身也是分层的,因为每个命名空间cgroup要么是根cgroup,要么有一个父命名空间cgroup。父母的所有限制cgroup都适用于孩子cgroup。子进程下的所有进程也cgroup属于父进程。cgroup

嵌套卷是可能的,因为文件系统是分层的,并且可以将一个文件系统挂载到另一个文件系统的目录中。通过使用新的命名空间,主机文件系统对来宾隐藏mount。这可以嵌套,因为命名空间可以嵌套。

网络由命名空间处理net,命名空间也可以嵌套。

其中许多事情都需要根命名空间中的功能,这可以通过使用标志运行容器来--privileged实现

相关内容