1

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

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

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

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

我是否正确假设作为此引导过程的一部分,C 代码将使用“init”cmd 行标志回调到 runC 的(克隆/子级)?

4

2 回答 2

1

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

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

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

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

于 2017-03-16T00:56:18.513 回答
0

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

于 2017-03-09T13:51:57.793 回答