0

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

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

如果我再在主机上做ps -ef | grep sleep我找不到sleep进程。
我认为在 Linux 中进程是可见的。它如何在 Mac 上运行?

4

2 回答 2

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 上是如何工作的 :-)

于 2018-11-10T23:03:37.130 回答
0

当且仅当您在 Linux 主机上运行 Linux 容器时,您才能从主机 Linux 系统查看 docker 容器内的子进程。没有其他主机将支持容器的子进程可见。

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

但是,对于 Mac 或 Windows 系统,情况并非如此。作为主机操作系统的这两个操作系统上的 Docker 技术与 Linux 不同。在这些平台上,Docker 引擎/机器创建了一个单独的虚拟化层作为访客操作系统,以防止在 Docker 容器下列出子进程。

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

于 2020-09-05T10:14:47.747 回答