centos7下安裝docker(10容器底層--cgroup和namespace)


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中並不存在

 


免責聲明!

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



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