【docker】小技巧:在宿主機器上直接查看docker容器的進程


轉載自:https://blog.csdn.net/weixin_34123613/article/details/88811722

 

最近看了這篇文章:Understanding how uid and gid work in Docker containers,了解到:

  1. docker容器內的一個進程對應於宿主機器上的一個進程。
  2. 容器內的進程,與相對應的宿主進程,由相同的uid、gid擁有。也就是說,如果在容器內主進程屬於用戶uid=1000,那么這個容器進程在宿主機器上也屬於用戶uid=1000。容器內的用戶uid=1000就是容器外的用戶uid=1000,也是其他容器內的用戶uid=1000。上面鏈接的文章介紹了很多這樣的例子。

讓我們來驗證這兩點。

docker容器內的一個進程對應於宿主機器上的一個進程

在我的Ubuntu上沒有安裝、更沒有運行mysql,但是我通過docker啟動了一個mysql容器。此時,我能夠通過在宿主機器上的命令行ps aux | grep mysql看到mysql的進程:


我們能在宿主機器上看到mysqld創建的進程,驗證了第一點。

容器內的進程,與相對應的宿主進程,由相同的uid、gid擁有

現在我們驗證一下【在宿主機器上的進程擁有者uid、gid】是不是等於【在容器內的進程擁有者uid、gid】。

在宿主機器上的進程擁有者uid、gid

在上面的ps aux | grep mysql輸出中,顯示進程ID是25138,【容器進程擁有者的用戶名】是guest-v+,看不到uid。並且,我們無法通過id guest-v+查看用戶信息,因為這個用戶名是虛擬的。

在搜索一番以后,我發現ps命令非常強大,幾乎能給你所有需要的進程信息!設置幾個參數就能讓它輸出我們想要的進程信息:

ps --pid 25138 -O uid,uname,gid,group,ppid

上面的參數表示,我要查看pid為25138的進程,並且除了默認的列以外,多展示幾列:uid,uname,gid,group,ppid。
輸出如下:

終於找到了!【在宿主機器上的進程擁有者uid】是999,groupid也是999。(PPID(parent pid)展示了父進程的pid,有了它,你可以繼續查看父進程的信息)

在  ps manuals中,能找到這個命令的更多用法、更多可以展示的列:
clipboard.png

在容器內的進程擁有者uid、gid

接下來,讓我們查看【在容器內的進程擁有者uid】。
通過docker exec -it 容器名稱 bash,在容器內運行一個bash。
根據我之前的博客,執行apt-get update && apt-get install procps,在容器內安裝ps(大部分容器為了精簡,沒有預裝ps)。
使用ps ax -O uid,uname,gid,group,ppid,查看容器內的所有進程:

可以看到,在容器內,msqld進程的擁有者uid也是999,groupid也是999。

【在宿主機器上的進程擁有者uid】和【在容器內的進程擁有者uid】都是999,gid同理,我們已經驗證了第二點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM