为什么在Docker容器内运行top命令只显示容器内的进程?

3

我在docker容器内运行top命令,发现只显示了用于运行容器的初始进程和top进程。为什么不显示docker主机上的其他进程呢?

最初的回答:

因为Docker容器是一个隔离的环境,只能看到在该容器中运行的进程。如果您想查看Docker主机上的所有进程,请在主机上运行top命令。


1
容器是假装成一个小型计算机。这就是为什么你可以在云上运行的虚拟机上调出任务管理器,而不会看到正在特定虚拟化程序上运行的7250亿个其他进程的原因。 - Davesoft
类似的例子可以这样说:如果你通过SSH登录到另一台服务器并运行top命令,你只能看到该服务器上的进程,而无法看到你自己的计算机上的进程。 - Joseph Cho
绝对不同于上面两条评论所描述的。:) Docker 不是一个虚拟机。它不像虚拟机那样模拟物理计算机,而是在相同的操作系统下运行。至于与SSH的比较...嗯... - ibz
1个回答

9
为了理解此现象的原因,您需要了解Linux的基本概念,Docker正在利用这些概念。
Linux内核中有一个叫做"namespaces"的功能,它以一种分区/隔离主机资源的方式运作,使一组进程看到一组资源,而另一组进程则看到另一组资源。
Linux有七种类型的命名空间:
- Mount-隔离挂载点 - UTS-隔离主机名 - IPC-隔离进程间通信资源 - PID-隔离PID号码空间 - Network-隔离网络接口 - User-隔离UID/GID号码空间 - Cgroup-隔离cgroup根目录
当您在Linux机器上工作时,所有操作都在同一个命名空间中,但是当您通过执行`docker run`创建一个容器时,默认情况下它会创建一个新的单独的命名空间,以将容器与主机隔离开来。
在您提出的问题中,只有一个进程在运行,因为容器位于不同的PID命名空间中,与主机机器相隔离。
您可以通过使用`--pid="host"`选项告诉Docker共享相同的PID命名空间,在某些情况下这样做是有用的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接