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

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

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

讓咱們來驗證這兩點mysql

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

在個人Ubuntu上沒有安裝、更沒有運行mysql,可是我經過docker啓動了一個mysql容器。此時,我可以經過在宿主機器上的命令行ps aux | grep mysql看到mysql的進程:sql


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

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

如今咱們驗證一下【在宿主機器上的進程擁有者uid、gid】是否是等於【在容器內的進程擁有者uid、gid】。ubuntu

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

在上面的ps aux | grep mysql輸出中,顯示進程ID是25138,【容器進程擁有者的用戶名】是guest-v+,看不到uid。而且,咱們沒法經過id guest-v+查看用戶信息,由於這個用戶名是虛擬的。segmentfault

在搜索一番之後,我發現ps命令很是強大,幾乎能給你全部須要的進程信息!設置幾個參數就能讓它輸出咱們想要的進程信息:bash

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

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

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

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。spa

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

相關文章
相關標籤/搜索