我有一个带有程序的docker容器,该程序将某个C ++代码编译为a.out文件,然后运行它。
当我跑步时,我在码头工人外面的“顶部”看到a.out。我甚至可以从码头外部杀死这个过程。
这是预期的行为吗?即,如果进程在docker中运行,是否可以从docker外部看到并杀死它?或者我可能以错误的方式使用码头工具?
答案 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命名空间的视图中检查进程。