如何查看主机中容器内部的真实过程?

时间:2018-11-10 17:40:43

标签: macos docker docker-container

我在Mac中启动一个容器,例如docker run -it ubuntu:latest /bin/bash
我可以从docker inspect中找到/bin/bash的PID,但是在我的Mac中找不到/bin/bash的真实PID。
再举一个例子:

docker run -it ubuntu:latest /bin/bash  
sleep 2000&  

如果我随后在主机ps -ef | grep sleep中进行操作,则找不到sleep进程。
我认为在Linux中这些过程是可见的。在Mac上如何运作?

2 个答案:

答案 0 :(得分:2)

我会说你没有。至少不是从主机上使用ps -ef | grep sleep

这可能有效:

docker run -it --rm --name coolname ubuntu:latest /bin/bash
sleep 2000&

主机:

docker exec -it coolname ps -ef | grep sleep

在Mac上,您可以更进一步,因为docker“ native”实际上是最小的Linux发行版。该图像是实际的“共享资源”。您可以使用screen

之类的命令进入该图像
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty

现在是否要在终端中执行以下操作:

docker run -it alpine /bin/sh
sleep 424242&

如上所述登录本机映像。您将看到sleep命令,结果如下:

linuxkit-025000000001:~# ps -ef|grep sleep
 3190 root      0:00 sleep 424242
 3193 root      0:00 grep sleep

因此实际上可以看到共享资源。因此,它也应该可以在Linux上运行,但是它可能是完全本机的。

它在Windows上是如何工作的,我不知道:-)

答案 1 :(得分:0)

当且仅当您在Linux Host上运行Linux容器时,您才能在Host Linux系统中的Docker容器中看到子进程。没有其他主机支持容器的子进程可见。

因此,考虑到您正在Linux上运行Linux容器,则基础Docker技术直接使用Linux内核,而无需创建任何虚拟化层。因此,如果从主机运行** top **命令,您将能够看到子进程以及父Docker进程。

但是,对于Mac或Windows系统却不是这样。作为主机操作系统的这两个OS上的Docker技术与Linux不同。在这些平台上,Docker引擎/机器将创建单独的虚拟化层作为来宾操作系统,从而阻止在Docker容器下列出子进程。

尽管如此,我们总是通过使用@Ivonet试图回答的docker exec命令进入docker。