gpt4 book ai didi

docker - libcontainer,runc和nsenter Bootstrap

转载 作者:行者123 更新时间:2023-12-02 19:37:50 25 4
gpt4 key购买 nike

我对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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com