libcontainer,runc和nsenter bootstrap

时间:2017-03-09 13:24:15

标签: docker containers runc

我对docker / containers相当新,并试图通过查看代码来更好地理解它。

看看runC,看起来它像旧的代码库中的nsinit一样使用libcontainer,我试图用它作为起点来理解如何使用libcontainer并深入挖掘libcontainer的工作原理。

我发现有一点难以理解的事情是引导过程和对nsexec的C代码的调用。

我广泛理解在调用应用程序(runC / libcontainer)可以将控制权移交给容器进程之前,需要对命名空间等进行一些初始化,但我似乎无法找到一个好的一步一步解释。有谁知道这方面的任何好文档?

我认为,作为此引导过程的一部分,C代码将使用" init"回调(runC的克隆/子代)。 cmd line flag?

2 个答案:

答案 0 :(得分:1)

这是一个解释。你可以阅读this document,但说实话它有点过时了。实际上这就是它的工作原理。

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

当您运行普通用户进程时,只需调用runC,此代码实际上不会执行任何操作。但是,如果您的进程将成为容器初始化进程(它设置了_LIBCONTAINER_INITPIPE环境变量),那么它将从_LIBCONTAINER_INITPIPE指定的文件描述符中读取一堆配置信息并设置名称空间和其他事情相应。完成所有这些操作后,该函数将返回,Go运行时将启动到runc init代码,然后完成容器的设置。

所有这些代码都非常类似于libcontainer在runC拆分之前的工作方式。

答案 1 :(得分:0)