Virtual machine 主机进程列表上显示的Docker进程

Virtual machine 主机进程列表上显示的Docker进程,virtual-machine,docker,Virtual Machine,Docker,我使用docker设置了一个Selenium服务器,基本上遵循github教程 设置服务器没有问题,但我注意到我在docker映像中启动的进程实际上显示在我的主机进程列表中 正如您在屏幕截图中看到的,docker运行了一个bash脚本,还执行了一个jar文件,我认为这应该只发生在盒子内部。这是否意味着来自主机的用户可能会杀死容器外的某个进程,从而彻底破坏盒子内的世界 当我停止容器时,所有进程都像我预期的那样消失了 这就是Docker的设计风格吗。。与Virtualbox/Vagrant相比,轻

我使用docker设置了一个Selenium服务器,基本上遵循github教程

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

正如您在屏幕截图中看到的,docker运行了一个bash脚本,还执行了一个jar文件,我认为这应该只发生在盒子内部。这是否意味着来自主机的用户可能会杀死容器外的某个进程,从而彻底破坏盒子内的世界

当我停止容器时,所有进程都像我预期的那样消失了

这就是Docker的设计风格吗。。与Virtualbox/Vagrant相比,轻量级的隔离系统存在缺陷,这是你必须接受的。。。 还是我做错了什么


谢谢

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


这种“有缺陷”的隔离实际上有一些很大的好处,比如能够从主机上运行的单个监控进程中删除所有容器中运行的进程。

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

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

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

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


还要注意,主机上的用户可以终止容器中由相同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映射uid和gid

好吧,如果你得到了指导,你就不会遇到外部资源的问题。但我不清楚你关于一些外部进程的问题…docker容器内的所有进程都是孤立的,只有当你杀死容器时,服务才会停止。事实就是这样。不确定我是否会将其描述为“有缺陷”。哇,如果您开始在主机上搜索“这到底是什么进程”,并且您甚至找不到进程的二进制文件,那就太好了,因为这些二进制文件隐藏在容器中……我试图从容器外部杀死其中一个容器进程,即作为主机系统的根。它与
kill
一起工作,但与
killall
一起工作时出现错误
:未找到进程
。原因是什么?关于从主机监视容器进程的评论值得称赞。