docker 容器如何存储在 ram 中并执行?

How are docker containers stored in the ram and executed?

我想知道操作系统如何管理 Docker 容器。我可以在这里找到一些解释:,但我不太明白。

我了解操作系统的基础知识(关于 PCB、ram、CPU、内核、系统调用等的概念)。

但我不明白 OS 是如何管理容器的:

图片:

这是我在这里找到的图片:


非常感谢您

前言:这是在 Arch 上测试的 Linux

  1. 容器是进程。我们有 dockerdcontainerd - 每个只有一次。然后每个容器我们有 dockercontainerd-shim 个进程,即 运行。请注意,containerd-shim 是容器的父级。它的目的是:

    • 首先,它允许运行时,即 runc,在启动容器后退出。这样我们就不必为容器设置冗长的 运行 运行时进程。当您启动 mysql 时,您应该只会看到 mysql 进程和 shim。

    • 其次,它保持 STDIO 和其他 fds 为容器打开,以防 containerd and/or docker 都死掉。如果 shim 不是 运行 那么管道的父端或 TTY 主机将关闭并且容器将退出。

    • 最后,它允许将容器的退出状态报告给更高级别的工具,如 docker,而无需成为容器进程的实际父级并执行 wait4。

(取自https://groups.google.com/forum/#!topic/docker-dev/zaZFlvIx1_k

  1. 请阅读 2 个关于系统调用的好答案( ) and roles of docker's parts ( ). Another good read https://medium.com/devopslinks/docker-containerd-standalone-runtimes-heres-what-you-should-know-b834ef155426

编辑: 快速回答:C 应用程序调用 forkmalloc => Linux 内核。 我错了,Docker 引擎不参与系统调用,所有控制都是通过命名空间进行的 / seccomp ( )

  1. 命名空间在ram中的表现形式有很大差异,可以查看源码

Why does wikipedia say that this notion is essential for containers

因为 "Various container software use Linux namespaces in combination with cgroups to isolate their processes, including Docker[8] and LXC" ( https://en.wikipedia.org/wiki/Linux_namespaces )

命名空间基本上就是工具,Docker引擎通过它控制容器的资源