我在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上如何运作?
答案 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。