容器是paas( platform-as-a-service,平台即服務)的一種體現。將所需軟體整合成乙個應用,乙個服務。
通俗的講:容器是一種沙盒技術。沙盒就是像貨櫃一樣,把應用整體封裝起來的技術。封裝後,應用與應用之間,在各自的邊界內執行,不會相互干擾;而被裝進貨櫃的應用,也可以被方便地搬來搬去。
容器技術的核心就是通過約束和修改程序的動態表現,從而為其創造出乙個「邊界」。 所以,容器只是執行在宿主機上的一種特殊的程序,使用的還是同乙個宿主機的作業系統核心。
docker在建立容器程序時,指定了這個程序所需要啟用的一組namespace引數。容器就只能看到當前namespace所限定的資源、檔案、裝置、狀態或者配置。而對於宿主機以及其他不相關的程式,它就完全看不到了。
虛擬機器主要是通過hypervisor 的硬體虛擬化功能,模擬執行乙個作業系統需要的各種硬體,比如 cpu、記憶體、i/o 裝置等等。然後,它在這些虛擬的硬體上安裝了乙個新的作業系統,即 guest os。
基於以上,使用者的應用程序就可以執行在這個虛擬的機器中,它能看到的只有 guest os 裡面的檔案和目錄,以及這個機器裡的虛擬裝置。
區別於虛擬機器技術的docker則是用乙個名為 docker engine 的軟體替換了 hypervisor。
docker專案幫助使用者啟動的,還是原來的應用程序,只不過在建立這些程序時,docker為它們加上了各種各樣的namespace引數。
程序會覺得自己是各自pid namespace裡的第1號程序,只能看到各自mount namespace裡面掛載的目錄和檔案,只能訪問到各自network namespace裡的網路裝置,就彷彿執行在乙個「容器」裡面一樣。
docker初始化時,缺省會啟用 pid, uts, network, user, mount, ipc, cgroup的namespace。
cgroups技術是用來製造約束的主要手段。
namespace技術是用來修改程序檢視的主要方法。
linux namespaces機制是linux提供的一種核心級別環境隔離的方法。 pid,ipc,network等系統資源不再是全域性性的,而是屬於特定的namespace。每個namespace裡面的資源對其他namespace都是透明的。 linux namespace官方文件《namespace in operation》
實現過程主要用到:
linux cgroups就是 linux 核心中用來為程序設定資源限制的,它就是乙個子系統目錄加上一組資源限制檔案的組合。
linux cgroups 的全稱是 linux control group。它最主要的作用,就是限制乙個程序組能夠使用的資源上限,包括 cpu、記憶體、磁碟、網路頻寬等等。cgroups 還能夠對程序進行優先順序設定、審計,以及將程序掛起和恢復等操作。
在 linux 中,cgroups 給使用者暴露出來的操作介面是檔案系統,即它以檔案和目錄的方式存在於 /sys/fs/cgroup 路徑下。
在 /sys/fs/cgroup 下面有很多諸如 cpuset、cpu、 memory 這樣的子目錄。這些都是機器當前可以被 cgroups 進行限制的資源種類。在其資源下可以看到該類資源具體可以被限制的方法。cgroups 的每一項子系統都有其獨有的資源限制能力,比如:
namespace 技術實際上只是限制了應用程序可以檢視的內容,這些程序和宿主機上的其他程序一樣,都是由宿主機作業系統統一管理,只不過這些被隔離的程序擁有額外設定過的 namespace 引數。
容器本身並沒有像hypervisor那樣對應用程序的隔離環境負責,真正對隔離環境負責的是宿主機作業系統。docker在這裡扮演的是輔助管理工作。
使用虛擬化技術作為應用沙盒,就必須要由 hypervisor 來負責建立虛擬機器,這個虛擬機器是真實存在的,並且它裡面必須執行乙個完整的 guest os 才能執行使用者的應用程序。這就不可避免地帶來了額外的資源消耗和占用,尤其對計算資源、網路和磁碟 i/o 的損耗非常大。
而相比之下,容器化後的應用,卻還是宿主機上的普通程序,所以效能損耗就不存在了;再有,使用 namespace 作為隔離手段的容器並不需要 guest os,這就使得容器額外的資源占用幾乎可以忽略不計。
基於 linux namespace 的機制隔離不徹底
首先,雖然容器只是執行在宿主機上的程序,但是那麼多個容器之間使用的還是同乙個宿主機的作業系統核心。 如果你要在 windows 宿主機上執行 linux 容器,或者在低版本的 linux 宿主機上執行高版本的 linux 容器,都是行不通的。
其次,在 linux 核心中,有很多資源和物件是不能被 namespace 化的,最典型的例子就是:時間。如果在虛機修改時間,會發現宿主機的也會改變。
容器的「限制」問題
上文說到容器只是看起來被封裝起來,但是實際上他和系統上其他的程序是有資源間相互競爭的關係。合理的評估資源的使用就顯得很重要了。
OLE技術專題 第一講 OLE概述
引言 概述 ole activex com技術是ms的核心應用技術,只有徹底洞察其理論精髓,才能以不變應萬變。我們首先從ole談起。一 過去的ole和今天的ole 作為com技術前身的ole,其最初含義是指在程式之間鏈結和嵌入物件資料 object link embeded 它提供了建立混合文件的手...
該聊一聊容器技術了
docker是乙個開源的應用容器引擎,容器,顧名思義就是用來裝東西的。我們平常用的伺服器 你也可以將它視為是乙個容器。那麼為什麼要用docker,因為它完美的解決了,應用程式和依賴 環境的問題。docker可以將你的應用和應用所依賴的環境打包在一起,形成乙個映象。能夠 幫助開發者快速的打包 測試 部...
該聊一聊容器技術了
docker是乙個開源的應用容器引擎,容器,顧名思義就是用來裝東西的。我們平常用的伺服器 你也可以將它視為是乙個容器。那麼為什麼要用docker,因為它完美的解決了,應用程式和依賴 環境的問題。docker可以將你的應用和應用所依賴的環境打包在一起,形成乙個映象。能夠 幫助開發者快速的打包 測試 部...