Docker 容器内的进程是什么样的?

Docker 容器内的进程是什么样的?

最近,我多次听到人们对 Docker 容器是什么感到困惑,更具体地说,关于我在 Docker 容器内调用的命令和进程,内部发生了什么。

有人可以提供有关正在发生的事情的高级概述吗?

答案1

Docker 被扔进虚拟化桶,因为人们认为它以某种方式虚拟化底层硬件。这是一个源自 Docker 使用的术语(主要是术语“容器”)的用词不当。

然而,Docker 在虚拟化系统硬件方面并没有做任何神奇的事情。相反,它利用 Linux 内核在关键设施周围构建“栅栏”的能力,允许进程与网络、文件系统和权限(以及其他事物)等资源进行交互,从而给人一种您正在交互的错觉具有功能齐全的系统。

下面的示例说明了当我们启动 Docker 容器,然后通过调用/bin/bash.

$ docker run -it ubuntu:latest /bin/bash
root@c0c5c54062df:/#

现在,从这个容器内部,如果我们运行ps -eaf

    SS01

切换到另一个终端选项卡,我们登录到托管 Docker 容器的主机系统,我们可以看到容器“实际”占用的进程空间:

    SS02

现在,如果我们返回到 Docker 选项卡并启动其中的多个进程并将它们全部置于后台,我们可以看到现在有几个子进程在主 Bash 进程下运行,这些子进程最初是作为 Docker 容器启动的一部分启动的。

笔记:这些进程是 4 个sleep 1000正在后台运行的命令。

    SS03

请注意 Docker 容器内部如何为进程分配 48-51 的进程 ID (PID)。ps -eaf也可以在其输出中查看它们:

    SS04

然而,通过下一张图片,Docker 正在执行的大部分“魔法”都被揭示了。

    SS05

看看这 4 个sleep 1000进程实际上只是我们原始 Bash 进程的子进程吗?另请注意,我们原来的 Docker 容器/bin/bash实际上也是 Docker 守护进程的子进程。

现在,如果我们要等待 1000 多秒才能sleep 1000完成原始命令,然后再运行 4 个新命令,并启动另一个 Docker 容器,如下所示:

$ docker run -it ubuntu:latest /bin/bash
root@450a3ce77d32:/#

主机的输出ps -eaf如下所示:

    SS06

以及其他 Docker 容器,都将仅显示为 Docker 守护进程下的进程。

所以你看,Docker确实不是虚拟化(传统意义上),它在各种内核资源周围构建“栅栏”,并限制给定进程+子进程的可见性。

答案2

里面在容器中,您的进程应该被隔离(隔离)。事实上,除了您指定的进程(至少是 shell)之外,您不应该看到任何进程。它不适用于“社交性”测试。与 chroot 唯一的相似之处是使用主机内核。如果您需要隔离某些内容或使用与主机上运行的平台架构软件不同版本的平台架构软件,那么 Docker 非常有用。 (非常旧的 Java 版本或 Python 的不同分支)。请敏锐地意识到,您正在处理的文件夹和二进制文件可能与主机上的文件夹和二进制文件不同。它不是相同的 /bin 文件夹等。

编辑:与 chroot 而不是 VM 相似。

相关内容