簡體   English   中英

如何在主機中查看容器內的真實進程?

[英]How can I see the real process inside the container in my host machine?

我在 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 ps -ef | grep sleep我找不到sleep進程。
我認為在 Linux 中進程是可見的。 它如何在 Mac 上運行?

我會說你沒有。 至少不是ps -ef | grep sleep 從主機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“本機”實際上是一個最小的 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 上是如何工作的 :-)

當且僅當您在 Linux 主機上運行 Linux 容器時,您才能從 Host Linux 系統看到 docker 容器中的子進程。 沒有其他主機將支持容器的子進程可見。

因此,考慮到您是在 Linux 上運行 Linux 容器,那么底層 Docker 技術直接使用 linux 內核,無需創建任何虛擬化層。 因此,如果您從主機運行 **top ** 命令,您將能夠看到子進程以及父 Docker 進程。

但是,這對於 Mac 或 Windows 系統來說並非如此。這兩個 OS 作為主機操作系統上的 Docker 技術與 Linux 不同。 在這些平台上,Docker 引擎/機器創建了一個單獨的虛擬化層作為來賓操作系統,以防止在 Docker 容器下列出子進程。

盡管如此,我們總是通過使用 docker exec 命令進入 docker,就像@Ivonet 試圖回答的那樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM