我对docker / container还是相当陌生,并且正在通过查看代码来更好地理解它。
看看runC,它看起来就像在旧代码库中的nsinit一样使用libcontainer,我试图以此为起点来了解如何使用libcontainer并更深入地研究libcontainer的工作原理。
我发现有些棘手的事情之一是引导过程和对nsexec的C代码的调用。
我确实广泛理解,在调用应用程序(runC / libcontainer)可以将控制权移交给容器过程之前,需要对 namespace 等进行一些初始化,但是我似乎找不到一个很好的逐步说明。有谁知道这方面的任何优秀文档?
我是否假设在此引导过程中C代码将使用“init” cmd行标志回调到runC(的克隆/子项)中,是否正确?
最佳答案
这是一个解释。您可以阅读this document,但说实话有点过时了。实际上,这就是它的工作方式。
当您在Go程序中导入"github.com/opencontainers/runc/libcontainer/nsenter"
时,我们有一些神奇的__attribute__
内容,它们告诉Go编译器在nst_rstrong Go运行时“启动”之前使nsexec运行。实际上,这意味着每次您运行任何runC程序时,我们的代码(在github.com/opencontainers/runc/libcontainer/nsenter/nsexec.c
中)都会在Go运行时启动之前运行。
当您运行普通用户进程时,仅调用runC,此代码实际上不执行任何操作。但是,如果您的进程将成为容器初始化进程(已设置_LIBCONTAINER_INITPIPE
环境变量),则它将从_LIBCONTAINER_INITPIPE
指定的文件描述符中读取一堆配置信息,并相应地设置 namespace 和其他内容。在完成所有这些设置之后,该函数将返回并且Go运行时将引导至runc init
代码,该代码随后完成容器的设置。
所有这些代码与runC拆分之前libcontainer
的工作方式非常相似。
关于docker - libcontainer,runc和nsenter bootstrap ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42696589/