概述
docker本質就是宿主機的一個進程,docker是通過namespace實現資源隔離,通過cgroup實現資源限制,通過寫時複製技術(copy-on-write)實現了高效的文件操作(類似虛擬機的磁盤比如分配500g並不是實際佔用物理磁盤500g)
1、namespaces 名稱空間
很多編程語言都包含了命名空間的概念,我們可以認為命名空間是一種封裝,封裝本身實際上實現了代碼的隔離,
在操作系統中命名空間命名空間提供的是系統資源的隔離,其中系統資源包括了:進程、網絡、文件系統......
實際上linux系統實現命名空間主要目的之一就是為了實現輕量級虛擬化服務,也就是我們說的容器,在同一個命名空間下的進程可以感知彼此的變化,而對其他命名空間的進程一無所知,這樣就可以讓容器中的進程產生一個錯覺,彷彿他自己置身於一個獨立的系統環境當中,以此達到獨立和隔離的目的。
這些隔離是怎麼管理起來的呢?這裡就需要用到Control groups控制組。
2、control Group 控制組
一種linux內核提供的一種可以限制、記錄、隔離進程組所使用的理資源的機制。為容器而生,沒有cgroups就沒有今天的容器技術。
2.1、cgroup的特點是:
cgroup的api以一個偽文件系統的實現方式,用戶的程序可以通過文件系統實現cgroup的組件管理。
cgroup的組件管理操作單元可以細粒度到線程級別,另外用戶可以創建和銷燬cgroup,從而實現資源載分配和再利用
所有資源管理的功能都以子系統的方式實現,接口統一子任務創建之初與其父任務處於同一個cgroup的控制組
2.2、cgroups子系統
- cpu 子系統,主要限制進程的 cpu 使用率。
- cpuacct 子系統,可以統計 cgroups 中的進程的 cpu 使用報告。
- cpuset 子系統,可以為 cgroups 中的進程分配單獨的 cpu 節點或者內存節點。
- memory 子系統,可以限制進程的 memory 使用量。
- blkio 子系統,可以限制進程的塊設備 io。
- devices 子系統,可以控制進程能夠訪問某些設備。
- net_cls 子系統,可以標記 cgroups 中進程的網絡數據包,然後可以使用 tc 模塊(traffic control)對數據包進行控制。
- net_prio — 這個子系統用來設計網絡流量的優先級
- freezer 子系統,可以掛起或者恢復 cgroups 中的進程。
- ns 子系統,可以使不同 cgroups 下面的進程使用不同的 namespace
- hugetlb — 這個子系統主要針對於HugeTLB系統進行限制,這是一個大頁文件系統。
2.3、四大功能:
- 資源限制:可以對任務使用的資源總額進行限制
- 優先級分配:通過分配的cpu時間片數量以及磁盤IO帶寬大小,實際上相當於控制了任務運行優先級
- 資源統計:可以統計系統的資源使用量,如cpu時長,內存用量等
- 任務控制:cgroup可以對任務執行掛起、恢復等操作
覺得有用的朋友多幫忙轉發哦!後面會分享更多devops和DBA方面的內容,感興趣的朋友可以關注下~
閱讀更多 波波說運維 的文章