Docker容器的本質,如何實現的 資源隔離、資源限制

docker 容器本質:

  1. 容器其實就是Linux下一個特殊的進程;

  2. Docker容器通過namespace實現進程隔離通過cgroups實現資源限制;

  3. Docker鏡像(rootfs)是一個操作系統的所有文件和目錄而不包括內核,Docker鏡像是共享宿主機的內核的;

  4. Docker鏡像是以只讀方式掛載,所有的增刪改都只會作用在容器層, 但是相同的文件會覆蓋掉下一層,這種方式也被稱爲"Copy-on-write";

使用Namespace進行容器的隔離有什麼缺點呢?

最大的缺點就是隔離不徹底

  1. 容器知識運行在宿主機上的一種特殊的進程,那麼多個容器之間使用的就還是同一個宿主機的操作系統內核

  2. 在Linux內核中,有很多資源和對象是不能被Namespace化的,最典型的例子是:時間即如果某個容器修改了時間,那整個宿主機的時間都會隨之修改

  3. 容器給應用暴露出來的攻擊面比較大,在生產環境中,沒有人敢把運行在物理機上的Linux容器暴露在公網上

linux 內核的namespace機制

  • namespace 機制提供一種資源隔離方案。

  • PID,IPC,Network 等系統資源不再是全局性的,而是屬於某個特定的Namespace。

  • 每個 namespace下的資源對於其他的 namespace下的資源是透明的,不可見的。

Linux內核實現 namespace的一個主要目的就是實現輕量級虛擬化(容器)服務,在同一個 namespace下的進程可以感知彼此的變化,而對外界的進程一無所知,以達到獨立和隔離的目的。

namespace可以隔離什麼

一個容器要想與其他容器互不干擾需要能夠做到:

  1. 文件系統需要是被隔離的

  2. 網絡也是需要被隔離的

  3. 進程間的通信也要被隔離

  4. 針對權限,用戶和用戶組也需要隔離

  5. 進程內的PID也需要與宿主機中的PID進行隔離

  6. 容器也要有自己的主機名
    有了以上的隔離,我們認爲一個容器可以與宿主機和其他容器是隔離開的。恰巧 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章