主机进程列表中显示的Docker进程

时间:2014-10-30 17:05:17

标签: virtual-machine docker

我正在使用docker设置Selenium服务器,基本上遵循this github教程。

我没有设置服务器的问题,但我注意到我在docker镜像中启动的进程实际上显示在我的主机进程列表中。

enter image description here

正如您在屏幕截图中看到的那样,docker运行了一个bash脚本并执行了一个jar文件,我认为该文件应该只发生在框内。这是否意味着来自主机的用户可能会杀死容器外的某个进程,这会完全搞砸盒子里面的世界?

当我停止容器时,所有进程都按照我的预期消失了。

这是Docker的设计方式..而且,与Virtualbox / Vagrant相比,你在交易中必须接受有缺陷的隔离...... 或者我做错了什么?

谢谢!

3 个答案:

答案 0 :(得分:33)

这似乎是一个常见的误解,认为Docker是轻量级虚拟机“,这就是为什么有些人可能期望与VirtualBox或VMWare类似的行为,但速度更快。

Docker不使用虚拟化,因此本机主机内核运行的所有进程只是彼此隔离。非root用户不能杀死容器内的进程,但root可以阻止整个容器不仅杀死进程。

要区分容器内运行的进程和其他进程,请运行top,然后按shift+f并选择nsPID和nsUSER,如附带的屏幕截图所示。

然后,您将在每个进程旁边看到命名空间,如果它直接在服务器上运行,则此值很可能为空,如果在容器内运行的进程,您将看到每个容器的命名空间ID。 (您可以按命名空间排序以查看每个容器中的进程)

top nsPID and nsUSER

答案 1 :(得分:25)

是的,这是预期的。请注意,进程是由root启动的,因此具有root权限的用户可以杀死它们,但具有root权限的用户可能会比这更糟糕(例如,卸载docker o_O)...

这"有缺陷"隔离实际上有一些很大的好处,比如能够monitor从主机上运行的单个监视进程中所有容器内运行的进程。

答案 2 :(得分:0)

还要注意,主机上的用户可以杀死由相同uid启动的容器中的进程。

这尤其值得关注,因为添加到容器中的第一个用户很有可能具有与主机上创建的第一个用户相同的uid。

$ ps -ef |grep '^install+ 26184'
install+ 26184 26177  1 Oct30 ?        00:18:18 /usr/lib/plexmediaserver/Plex Media Server

$ kill -9 26184

$ ps -ef |grep '^install+ 26184'

请注意,第一列显示了我自己的用户名,因为该进程正在使用uid在容器中运行,并且我在没有sudo或admin特权的情况下终止了该进程。

因此,要点之一是:

  • 在主机和容器上的两者上创建一个新帐户并进行分组,以确保不使用相同的uid / gid;或
  • 启用Docker user namespaces来映射uid和gid。