libcontainer, runc and nsenter bootstrap



我对Docker/Containers是相当新的,并且正在尝试通过查看代码来更好地理解它。

看一下runc,看起来它像旧代码基础中的nsinit一样使用libcontainer,我试图将其用作了解如何使用libcontainer并更深入地研究libcontainer的起点。

我发现有点棘手的一件事是bootstrap过程,而呼叫NSEXEC的C代码。

我确实明白,在调用应用程序(runc/libcontainer)可以将控件移交给容器过程之前,需要对命名空间等进行一些初始化,但是我似乎找不到一个很好的逐步解释。有人知道这个领域有任何好的文档吗?

我是否可以正确地假设作为此引导过程的一部分,C代码将带有" INIT" CMD LINE FLAG?

这是一个解释。您可以阅读此文档,但老实说,这有点过时了。有效地这就是它的工作方式。

当您在GO程序中导入"github.com/opencontainers/runc/libcontainer/nsenter"时,我们会有一些神奇的__attribute__内容,这些内容告诉GO编译器在 Go Runtime" boots''之前,将nsexec运行。实际上,这意味着每次运行任何RUNC程序时,我们的代码(在github.com/opencontainers/runc/libcontainer/nsenter/nsexec.c中)都在运行时开始。

当您运行普通用户进程时,只需调用runc时,此代码实际上没有做任何事情。但是,如果您的过程将是容器init进程(它具有_LIBCONTAINER_INITPIPE环境变量集),则它将从_LIBCONTAINER_INITPIPE指定的文件描述符中读取一堆配置信息,并相应地设置名称空间以及其他内容。所有这些设置后,函数将返回,并且GO运行时将启动到runc init代码中,然后最终确定容器的设置。

所有这些代码都与libcontainer在Runc Split之前的工作方式相似。

看起来这里有一个很好的解释:-https://groups.google.com/a/opencontainers.org/forum/forum/# !! msg/cc1xh92omre/g1grnbdgcaajjajjep>

最新更新