docker - libcontainer,runc和nsenter Bootstrap

标签 docker containers runc

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

相关文章:

azure - 从 Windows docker 容器访问 Azure 实例元数据服务 (169.254.169.254)

go - "make: go: command not found"- 尽管 go 二进制文件在 $PATH 中

linux - 为什么Docker构建需要使用/dev/shm?

java - 无法将intelliJ与Docker Machine连接

用于构建支持 SSL 的 uWSGI 的 Dockerfile

java - Java使用的内存远大于堆大小(或正确大小的Docker内存限制)

docker - 将docker-compose.yml转换为runc config.json

java - 如何使用 docker compose 将 spring boot 后端端口更改为 80?

docker - 为什么 Ubuntu docker 镜像不是虚拟机

linux - 适用于 Linux 的 Docker 和 Kubernetes 存储库