docker資源隔離實現方式


默認情況下,一個容器沒有資源限制,幾乎可以使用宿主主機的所有資源。
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 可以對任務進行掛起、恢復等操作


免責聲明!

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



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