是否应该在Docker上运行的进程对外部操作系统可见?

时间:2018-04-09 09:22:35

标签: docker

我有一个带有程序的docker容器,该程序将某个C ++代码编译为a.out文件,然后运行它。

当我跑步时,我在码头工人外面的“顶部”看到a.out。我甚至可以从码头外部杀死这个过程。

这是预期的行为吗?即,如果进程在docker中运行,是否可以从docker外部看到并杀死它?或者我可能以错误的方式使用码头工具?

2 个答案:

答案 0 :(得分:1)

  

这是预期的行为吗?

是。请注意,在主机上运行top时,您将看到docker容器进程。 Docker容器内的进程是沙箱,并且可以使用以下内容显示容器内的PID

docker container top <container-name>

这将显示与在计算机上运行top时不同的pid。

  

如果进程在docker中运行,是否可以从docker外部看到并杀死它?或者我可能以错误的方式使用码头工具?

docker容器只不过是一个进程。你可以看到它并像任何其他进程一样杀死它。

答案 1 :(得分:1)

与虚拟机不同,Docker通过使用Linux命名空间机制来隔离进程(这就是为什么我们将Docker称为轻量级隔离环境)。有pid,network,uid等名称空间。在这种情况下,我们关心 pid命名空间

您可以在pid_namesapces手册页中找到详细的讨论。在这里,我只选择相关信息:

  

PID命名空间可以嵌套:每个PID命名空间都有一个父节点,除了初始(&#34; root&#34;)PID命名空间。

     

进程对其PID命名空间中的其他进程是可见的,并且对于返回到根PID命名空间的每个直接祖先PID命名空间中的进程是可见的。在这种情况下,&#34;可见&#34;表示一个进程可以是另一个进程使用指定进程ID的系统调用的操作目标。

在容器外执行top命令时,您正在从顶级(根)pid命名空间的视图中检查进程。