天天看點

Linux 容器化技術前世今生(虛拟化、容器化、Docker)

雲栖号資訊:【 點選檢視更多行業資訊

在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

容器化技術自前幾年火熱發展後一直都是業内非常熱門的話題,為了拓展自己的知識面當然也要學起來,本篇文章從發展的角度來解釋了它的前世今生,并将它與傳統虛拟化技術做對比,并分析他們各自的運作原理。

虛拟化技術

虛拟化是過去用來充分利用計算機實體資源的最常用方法。早年間,我們可以用一台伺服器運作一個作業系統,處理一個任務,帶來的問題是資源使用率極其不足,計算機的潛能并不能完全發揮,而後多道批處理系統、分時系統相繼出現,Unix、Linux 等作業系統成為了人類 “壓榨” 計算機實體資源的神兵利器,而此時,虛拟化技術卻并未嶄露頭角。

目光聚焦到 20 世紀的 90 年代,當時 IT 行業逐漸步入工業化,大量公司部署起了自己内部的 IT 環境,他們使用了多個不同供應商提供的價格相對低廉的伺服器、作業系統和應用程式,此時就暴露出了一個嚴重的問題:大多數企業使用的都是實體伺服器或者由單家供應商提供的應用,每台伺服器又隻能運作一個供應商特定的任務,不同供應商之間硬體也并不相容,如果這時候再各自為他們配備不同的硬體裝置必然也會面臨實體硬體使用率不足的問題。此時虛拟化技術才得以大展身手,它主要解決了可對伺服器分區、可在同一個主機上運作不同環境的應用兩個主要的問題。

自此,伺服器開始得到更高效利用,也降低了企業采購、設定、散熱和維護的成本。虛拟化的廣泛應用也有助于減少企業對單家供應商的依賴,并為後來雲計算的發展奠定了基礎。

虛拟化的工作原理

虛拟化技術的實作主要依托于 Hypervisor (虛拟機監控程式)。它處于計算機實體層與虛拟機之間,能夠有效地管理計算機的實體資源并将這些資源配置設定給不同虛拟環境。作為軟體,Hypervisor 可以直接運作在作業系統之上;作為伺服器,它也可以直接安裝在硬體上,這就是大多數企業使用虛拟化的方式。

此時,Hypervisor 直接接管實體資源,可以對它們做分區處理,配置設定給了多個虛拟機使用,而使用者在虛拟機中也可以通過它直接和計算機底層互動。當虛拟機運作時,如果使用者的程式發出一條硬體指令請求資源,Hypervisor 就會直接将請求傳遞到實體系統做緩存更改,所有這些操作速度都和本機運作速度幾近相同,這種直接運作在實體硬體中的 Hypervisor 即為我們經常聽說的 Type1,也稱為裸機管理程式(Metal Hypervisor),目前市面上常用的 VMware ESXi、MiscroSoft Hyper-V 和 KVM(Kernel-based Virtual Machine)都基于這類 Hypervisor。

Linux 容器化技術前世今生(虛拟化、容器化、Docker)

而另一種運作于作業系統之上的 Hypervisor 即為 Type2,這種命名方式非常簡單粗暴,讓人很難忘記,它的處理方式就是使 Hypervisor 不直接與實體層基礎,是以也稱作托管程式(Hosted Hypervisor),它主要用于面向個體使用者,我們經常在本機中安裝的 Virtual Box、VMware WorkStation 就屬于這種類型。此時,相較于 Type1 ,Type2 顯然多了一些延遲。

Linux 容器化技術前世今生(虛拟化、容器化、Docker)

這樣,每個虛拟機在 Hypervisor 之上互相獨立,運作不同的作業系統,操作不同的實體資源,這也帶來了我們期望了靈活性和可移植性,我們可以将一個虛拟機從一個 Hypervisor 中直接遷移到一個新的 Hypervisor 中,此時就達到了一種環境複用的效果。

Linux 容器化技術前世今生(虛拟化、容器化、Docker)

虛拟化技術應用

虛拟化發展之初主要用于伺服器虛拟化,但随着這種方式逐漸普及,也衍生出了許多諸如網絡虛拟化,應用程式虛拟化,資料虛拟化以及存儲虛拟化等技術。本篇文章就不對他們再做一一介紹了,感興趣的讀者可以查閱底部衍生查閱中的相關資料。

容器化技術

此時,既然虛拟化技術已經成熟,我們就可以投入生産将它運用起來了,如果希望将自己開發的一個 NodeJs 程式放入虛拟機中,就需要在宿主系統中基于 Hypervisor 安裝一個 Linux 虛拟機(單獨安裝 Linux OS),并在 Linux 中為該服務配置一個完整的 JS 應用運作環境和必要的庫,如下圖所示。

Linux 容器化技術前世今生(虛拟化、容器化、Docker)

這樣做帶來的問題也明顯,NodeJS 運作時需要的資源可能非常少(10M),而虛拟機本身卻占有相當多的資源(>400M),如果繼續在該伺服器中放入更多的服務,資源消耗程度可見一般,伺服器迅速過載。

Linux 容器化技術前世今生(虛拟化、容器化、Docker)

從這方面來看,虛拟化技術雖然做到了在同一宿主系統提供不同的任務,解決了硬體層面的硬體資源共享問題,但在應用上層的資源消耗卻仍是一個非常大的難題。同時,在日常開發中,如果我們使用的是自己的個人電腦,像 Macbook 開發應用程式時推入服務端也可能存在其他相容性問題,通常是表現為我的應用程式在本地運作良好,投入生産環境後卻病态百出,不利于 DevOps、持續內建和傳遞。

容器化通過将應用程式代碼和運作所需的相關配置檔案,庫和依賴項捆綁起來解決了上面描述的兩個問題。此時,應用程式和其他依賴項俨然成為了一個整體,打包在一個檔案中,而運作這個檔案就會生成一個虛拟容器,程式在這個封閉的虛拟容器裡運作,容器提供了它想要的一切資源,就好像在真實的實體機上運作一樣。有了容器,再也不用擔心環境問題了。另外,如下圖所示,容器也不會捆綁應用環境所依賴的作業系統,輕量級不言而喻。

Linux 容器化技術前世今生(虛拟化、容器化、Docker)

要達到應用程式容器化通常隻需三步,首先,定義一個清單檔案(如 Docker 中的 Dockerfile 或者 Cloud Fundary 中的 yaml 檔案),然後,建立一個鏡像檔案(如 Docker Image 或者 Rocket 的 ACI),最後生成容器即可,這裡就包含了應用運作時所有需要的庫、二進制檔案等等,在上面的例子中,我們同樣可以通過該種方式獲得 NodeJS 程式的容器并将放入宿主系統中。

Linux 容器化技術前世今生(虛拟化、容器化、Docker)

此時,容器化技術也可以摒棄備援的資源消耗,實作更加輕量級的環境部署。另外,再考慮一個問題,如果在我們的 Nodejs 應用中還需要應用其他環境的庫,如需要 python 應用做圖像識别、java 應用做資料處理,那麼,如果使用虛拟化技術,為了達到雲原生的方式就必須在之前的宿主主機中釋放出一些資源,然後再将 python 等應用部署進去,而當使用容器化技術時隻需要在原伺服器中放入一個 python 應用的副本,然後利用剩餘的空閑資源做容器之間的共存,這正是容器化技術的偉大之處,它可以實作容器間隔離的同時做到 CPU 資源共享。

Linux 容器化技術前世今生(虛拟化、容器化、Docker)

此時,容器引擎(如 Docker 引擎)安裝在宿主系統中可以成為所有容器共享同一作業系統資源的管道。

Linux 容器是我們開發、部署和管理應用方式的又一次飛躍。Linux 容器鏡像提供了可移植性和版本控制,確定能夠在開發人員的筆記本電腦上運作的應用,同樣也能在生産環境中正常運作。相較于虛拟機,Linux 容器在運作時所占用的資源更少,使用的是标準化接口(啟動、停止、環境變量等),并會與其他應用隔離。此外,作為(包含多個容器)大型應用的一部分時,容器也更易于管理。

容器化技術應用

容器化技術日益發展,尤其是在雲環境中,許多企業已經在考慮将容器替代虛拟機作為他們應用的通用計算平台了,在其如此廣泛的應用,如下幾個最為典型:

  • 微服務:容器小巧輕量,非常适合微服務體系結構,在微體系結構中,應用程式可以由許多松散耦合且可獨立部署的較小服務構成。
  • DevOps:微服務作為架構和容器與平台的結合,可作為許多團隊将 DevOps 視為建構,傳遞和運作軟體的方式的共同基礎。
  • 混合雲(hybrid cloud)、多雲方案(multi-cloud):由于容器可以在筆記本電腦,本地和雲環境中的任何地方運作,是以它是混合雲和多雲方案的理想基礎架構,在這種情況下,企業可以在多個公有雲中與資料中心互動。
  • 應用程式現代化遷移:容器化可以使應用程式現代化,并直接遷移到雲中。

容器化技術規範化

随着容器化技術的不斷發展,對容器技術和打包軟體代碼方法的标準化需求也逐漸顯現出來了,2015 年 6 月,Docker 和其他行業推動者成立了開放容器計劃(OCI),目的就是為了促進容器技術的通用,輕量,開放标準以及規範化,使用者也将不會再被特定廠商的技術所束縛,而可以利用 OCI 認證的技術,這些技術使使用者能夠使用多種 DevOps 工具建構容器化的應用程式,并在基礎架構上以一緻地标準流程運作這些應用程式。

目前,Docker 是應用最廣泛的容器引擎技術之一,但它也并不是我們唯一的選擇,社群也正在對容器化和其他替代方案(例如 CoreOS rkt,Mesos Containerizer,LXC Linux 容器,OpenVZ 和 crio-d 等等)進行标準化。雖然現在,他們的功能和預設設定可能會有所不同,但是随着不斷規範化地發展,利用 OCI 規範就能確定解決方案與特定供應商無關,可以完全在多種環境中使用部署應用。

Docker

Docker 技術使用的是 Linux 核心和其相關功能(例如 Cgroups 和 namespaces)來分隔程序,達到各程序互相獨立運作。這種獨立性正是采用容器的意義所在,它可以獨立運作多種程序、多個應用,更加充分地利用基礎資源,同時保持各個獨立系統的安全性。

此外。Docker 技術與傳統的 Linux 容器也并不完全相同,最初它是基于 LXC(LinuX Containers,Linux 容器) 技術建構,但後來它逐漸擺脫了對這種技術的依賴。與虛拟化相比較,LXC 确實獨占鳌頭,但它并不能提供良好的使用者體驗,這一點,Docker 顯然更勝一籌,除了運作容器之外,Docker 技術也具備其他多項功能,包括簡化用于建構容器、傳輸鏡像以及控制鏡像版本的流程等等。

傳統的 Linux 容器使用 init 系統來管理多種程序,這使得所有應用都作為一個整體運作在不同的環境中,而 Docker 技術正與此相反,它力争讓應用各自獨立運作在程序中,并提供相應工具,幫助實作這一功能,這種精細化運作模式自有其優勢。

【雲栖号線上課堂】每天都有産品技術專家分享!

課程位址:

https://yqh.aliyun.com/live

立即加入社群,與專家面對面,及時了解課程最新動态!

【雲栖号線上課堂 社群】

https://c.tb.cn/F3.Z8gvnK

原文釋出時間:2020-05-16

本文作者:Meandni

本文來自:“

掘金

”,了解相關資訊可以關注“掘金”