cgroup和namespace是實現容器底層的重要技術
cgroup:實現資源限制
namespace:實現資源隔離
1.cgroup:control group
Linux操作系統通過cgroup可以設置進程使用CPU,內存和IO資源使用的限額。我們之前學習的通過-m,--memory-swap,-c,--blkio-weight就是通過cgroup實現的。那么cgroup到底是什么樣子的呢?
可以在/sys/fs/cgroup里面找到,例如:
我們運行一個容器,我們設置的cpu的權重是700
我們進入/sys/fs/cgroup/cpu/docker目錄下的相應的容器的ID的目錄里面,看cpu.shares,可以看到我們設置的權重是700
同樣的我們進入/sys/fs/cgroup/memory/docker/中大概是memory.limit_in_bytes這個文件是容器內存的大小
同樣的我們進入/sys/fs/cgroup/blkio/docker/中,blkio.weight這個文件是Block IO的權重文件
我們可以在以上的文件中,查看或者更改容器資源的大小
2.namespace
我們運行的每一個容器,都像是一個新的操作系統一樣,都有文件系統,網卡等資源;那網卡來說,每個容器都會認為自己有一塊獨立的網卡,即使Host主機實際只有一塊網卡資源,這樣的方式使容器更像是一個獨立的計算機。
namespace管着Host中全局唯一的資源,並讓每個容器都覺得只有自己在使用它,namespace實現了容器間的資源隔離
Linux使用了6種namespace:Mount,UTS,IPC,PID,Network
一。Mount namspace:讓容器看上去擁有整個文件系統
容器有自己的 / 目錄,可執行mount和umount命令。這些操作只對當前的容器生效,不會影響到host和其他容器
對於mount namespace的實驗可以參考:https://segmentfault.com/a/1190000006912742
二。UTS namespace:讓容器有自己的hostname
默認情況下容器的hostname是他的 短ID ,可以通過 -h或者--hostname來設置容器的主機名
三。IPC namespace:讓容器有自己的共享內存和信號量(semaphore)
讓容器有自己的共享內存和信號量(semaphore)來實現進程間通信,而不會與host以及其他容器的ipc混在一起
四。PID namespace:讓容器有自己獨立的PID進程
我們知道,容器在host中以進程的形式運行,例如:
docker ps可以看到運行了幾個容器
我們通過 ps axf可以看到容器的進程:第一列為容器的PID號
可以看到所有容器的進程都掛在了dockerd進程下,同事可以看到容器的自己的子進程,但是如果我們進入到某個容器里面,ps后只能看到自己的進程了
例如:
從這里可以看到容器的PID不同於Host上面對應的PID,容器中PID=1的進程當然也不是host的init進程。這也就證明了容器有自己的一套獨立的PID進程
五:Network namespace:讓容器有自己獨立 的網絡資源
Network namespace讓容器有自己獨立的網卡 ,IP,路由等資源。
六。User namespace :讓容器能夠管理自己的用戶,Host不能看到容器中創建的用戶
當我們返回到Hostname上面的時候,切換到同樣的用戶,可以看到
在容器中創建的用戶在host中並不存在