[英]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.