轉載自:https://blog.csdn.net/weixin_34123613/article/details/88811722
最近看了這篇文章:Understanding how uid and gid work in Docker containers,了解到:
- docker容器內的一個進程對應於宿主機器上的一個進程。
- 容器內的進程,與相對應的宿主進程,由相同的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中,能找到這個命令的更多用法、更多可以展示的列:
![]()
在容器內的進程擁有者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同理,我們已經驗證了第二點。

