默認狀況下,一個容器沒有資源限制,幾乎可使用宿主主機的全部資源。
docker提供了控制內存、cpu、block io。可是實際上主要是namespace和cgroup控制資源的隔離。docker
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(命名空間)能夠隔離哪些網絡
使用Namespace進行容器的隔離有什麼缺點呢?
最大的缺點就是隔離不完全
1)容器知識運行在宿主機上的一種特殊的進程,那麼多個容器之間使用的就仍是同一個宿主機的操做系統內核
2)在Linux內核中,有不少資源和對象是不能被Namespace化的,最典型的例子是:時間即若是某個容器修改了時間,那整個宿主機的時間都會隨之修改
3)容器給應用暴露出來的攻擊面比較大,在生產環境中,沒有人敢把運行在物理機上的Linux容器暴露在公網上工具
Linux的 cgroups
強大內核工具cgroups
cgroups是Linux的另一個強大的內核工具,有了cgroups,不只能夠限制被namespace隔離起來的資源,還能夠爲資源設置權重、計算使用量、操控任務(進程或縣城)啓停等。說白了就是:cgroups能夠限制、記錄任務組所使用的物理資源(包括CPU,Memory,IO等),是構建Docker等一系列虛擬化管理工具的基石。spa
cgroups 的做用
cgroups 爲不一樣用戶層面的資源管理提供了一個統一接口,從單個的資源控制到操做系統層面的虛擬化,cgroups提供了4大功能。操作系統
cgroups能夠對任務使用的資源總額進行限制。
如 設定應用運行時使用的內存上限,一旦超過配額就發出OOM提示對象
經過分配的CPU時間片數量以及磁盤IO帶寬大小,實際上就至關於控制了任務運行的優先級接口
cgroups能夠統計系統的資源使用量
如CPU使用時長,內存用量等,這個功能很是適用於計費進程
cgroups 能夠對任務進行掛起、恢復等操做內存