默認情況下,一個容器沒有資源限制,幾乎可以使用宿主主機的所有資源。
docker提供了控制內存、cpu、block io。但是實際上主要是namespace和cgroup控制資源的隔離。
Docker的隔離性主要運用Namespace 技術。傳統上Linux中的PID是唯一且獨立的,在正常情況下,用戶不會看見重復的PID。然而在Docker采用了Namespace,從而令相同的PID可於不同的Namespace中獨立存在。如,A Container 之中PID=1是A程序,而B Container之中的PID=1同樣可以是A程序。雖然Docker可透過Namespace的方式分隔出看似是獨立的空間,然而Linux內核(Kernel)卻不能Namespace,所以即使有多個Container,所有的system call其實都是通過主機的內核處理,這便為Docker留下了不可否認的安全問題。
namespace(命名空間)可以隔離哪些
- 文件系統需要是被隔離的
- 網絡也是需要被隔離的
- 進程間的通信也要被隔離
- 針對權限,用戶和用戶組也需要隔離
- 進程內的PID也需要與宿主機中的PID進行隔離
- 容器也要有自己的主機名
- 有了以上的隔離,我們認為一個容器可以與宿主機和其他容器是隔離開的。
- 恰巧Linux 的namespace可以做到這些。
使用Namespace進行容器的隔離有什么缺點呢?
最大的缺點就是隔離不徹底
1)容器知識運行在宿主機上的一種特殊的進程,那么多個容器之間使用的就還是同一個宿主機的操作系統內核
2)在Linux內核中,有很多資源和對象是不能被Namespace化的,最典型的例子是:時間即如果某個容器修改了時間,那整個宿主機的時間都會隨之修改
3)容器給應用暴露出來的攻擊面比較大,在生產環境中,沒有人敢把運行在物理機上的Linux容器暴露在公網上
Linux的 cgroups
強大內核工具cgroups
cgroups是Linux的另外一個強大的內核工具,有了cgroups,不僅可以限制被namespace隔離起來的資源,還可以為資源設置權重、計算使用量、操控任務(進程或縣城)啟停等。說白了就是:cgroups可以限制、記錄任務組所使用的物理資源(包括CPU,Memory,IO等),是構建Docker等一系列虛擬化管理工具的基石。
cgroups 的作用
cgroups 為不同用戶層面的資源管理提供了一個統一接口,從單個的資源控制到操作系統層面的虛擬化,cgroups提供了4大功能。
- 資源限制
cgroups可以對任務使用的資源總額進行限制。
如 設定應用運行時使用的內存上限,一旦超過配額就發出OOM提示
- 優先級分配
通過分配的CPU時間片數量以及磁盤IO帶寬大小,實際上就相當於控制了任務運行的優先級
- 資源統計
cgroups可以統計系統的資源使用量
如CPU使用時長,內存用量等,這個功能非常適用於計費
- 任務控制
cgroups 可以對任務進行掛起、恢復等操作