docker 容器本質:
-
容器其實就是Linux下一個特殊的進程;
-
Docker容器通過namespace實現進程隔離通過cgroups實現資源限制;
-
Docker鏡像(rootfs)是一個操作系統的所有文件和目錄而不包括內核,Docker鏡像是共享宿主機的內核的;
-
Docker鏡像是以只讀方式掛載,所有的增刪改都只會作用在容器層, 但是相同的文件會覆蓋掉下一層,這種方式也被稱爲"Copy-on-write";
使用Namespace進行容器的隔離有什麼缺點呢?
最大的缺點就是隔離不徹底
-
容器知識運行在宿主機上的一種特殊的進程,那麼多個容器之間使用的就還是同一個宿主機的操作系統內核
-
在Linux內核中,有很多資源和對象是不能被Namespace化的,最典型的例子是:時間即如果某個容器修改了時間,那整個宿主機的時間都會隨之修改
-
容器給應用暴露出來的攻擊面比較大,在生產環境中,沒有人敢把運行在物理機上的Linux容器暴露在公網上
linux 內核的namespace機制
-
namespace 機制提供一種資源隔離方案。
-
PID,IPC,Network 等系統資源不再是全局性的,而是屬於某個特定的Namespace。
-
每個 namespace下的資源對於其他的 namespace下的資源是透明的,不可見的。
Linux內核實現 namespace的一個主要目的就是實現輕量級虛擬化(容器)服務,在同一個 namespace下的進程可以感知彼此的變化,而對外界的進程一無所知,以達到獨立和隔離的目的。
namespace可以隔離什麼
一個容器要想與其他容器互不干擾需要能夠做到:
-
文件系統需要是被隔離的
-
網絡也是需要被隔離的
-
進程間的通信也要被隔離
-
針對權限,用戶和用戶組也需要隔離
-
進程內的PID也需要與宿主機中的PID進行隔離
-
容器也要有自己的主機名
有了以上的隔離,我們認爲一個容器可以與宿主機和其他容器是隔離開的。恰巧 Linux 的 namespace可以做到這些。
namespace | 隔離內容 | 系統調用參數 |
---|---|---|
UTS | 主機名與域名 | CLONE_NEWUTS |
IPC | 信號量、消息隊列和共享內存 | CLONE_NEWIPC |
Network | 網絡設備、網絡棧、端口等 | CLONE_NEWNET |
PID | 進程編號 | CLONE_NEWPID |
Mount | 掛載點(文件系統) | CLONE_NEWNS |
User | 用戶和用戶組 | CLONE_NEWUSER |
Linux的 cgroups
強大內核工具cgroups
cgroups是linux內核提供的一種機制,這種機制可以根據需求把一系列任務及其子任務整合(或分隔)到按資源分等級的不同組內,從而爲系統資源提供一個統一的框架。
cgroups是Linux的另外一個強大的內核工具,有了cgroups,不僅可以限制被namespace隔離起來的資源,還可以爲資源設置權重、計算使用量、操作任務(進程或線程)啓動停止等。說白了就是:cgroups可以限制、記錄任務組所使用的物理資源(包括CPU,Memory,IO等),是構建Docker等一系列虛擬化管理工具的基石。
cgroups 的作用
cgroups 爲不同用戶層面的資源管理提供了一個統一接口,從單個的資源控制到操作系統層面的虛擬化,cgroups提供了4大功能。
-
資源限制
cgroups可以對任務使用的資源總額進行限制。 如 設定應用運行時使用的內存上限,一旦超過配額就發出OOM提示
-
優先級分配
通過分配的CPU時間片數量以及磁盤IO帶寬大小,實際上就相當於控制了任務運行的優先級
-
資源統計
cgroups可以統計系統的資源使用量 如CPU使用時長,內存用量等,這個功能非常適用於計費
-
任務控制
cgroups 可以對任務進行掛起、恢復等操作
參考摘選:https://blog.csdn.net/u013302586/article/details/100573676