目錄
一? 消除恐懼
1) 什么是虛擬化,容器化
2)案例
3)為什么需要虛擬化,容器化
?二? 虛擬化實現方式
1)應用程序執行環境分層
2)虛擬化常見類別
3)常見虛擬化實現
一)主機虛擬化(虛擬機)實現
二)容器虛擬化實現
一? 消除恐懼
1) 什么是虛擬化,容器化
總結:虛擬化就是把一臺物理計算機切分成很多邏輯計算機
? ? ? ? ? ?容器化就是虛擬化的一種技術,主要虛擬的是操作系統層面
物理機:實際的服務器或者計算機。相對于虛擬機而言的對實體計算機的稱呼。物理 機提供給虛擬機以硬件環境,有時也稱為“寄主”或“宿主”。
虛擬化:是指通過虛擬化技術將一臺計算機虛擬為多臺邏輯計算機。在一臺計算機上 同時運行多個邏輯計算機,每個邏輯計算機可運行不同的操作系統,并且應用程序都 可以在相互獨立的空間內運行而互不影響,從而顯著提高計算機的工作效率。
容器化:容器化是一種虛擬化技術,又稱操作系統層虛擬化(Operating system level virtualization),這種技術將操作系統內核虛擬化,可以允許用戶空間軟件實例 (instances)被分割成幾個獨立的單元,在內核中運行,而不是只有一個單一實例運 行。這個軟件實例,也被稱為是一個容器(containers)。對每個實例的擁有者與用戶 來說,他們使用的服務器程序,看起來就像是自己專用的。容器技術是虛擬化的一種。 docker 是現今容器技術的事實標準。
2)案例
物理機如下,就像一個莊園,獨立占用了一塊土地,花園都是自己的,其他人無法共 享使用。
虛擬機相當于開發商的一個樓盤,一棟樓一套房子一戶人家,共享一塊宅基地,共享 小區的花園,共享小區的游樂設施。?
容器相當于在 1 個房子里面,開辟出來一個又一個的膠囊公寓,共享這套房子的衛生間、共享廚房、共享 WiFi.只有衣服、電腦等私人物品是你自己的。
3)為什么需要虛擬化,容器化
我們從上面的歷史發展來看,虛擬化和容器化的最主要目的就是資源隔離,隨著資源 隔離的實現逐漸也帶來了更大的收益。
- 資源利用率高:
- 將利用率較低的服務器資源進行整合,用更少硬件資源運行更多業務,降低 IT 支出和 運維管理成本。 比如上圖中我們的土地直接復用,使用這塊土地的人多了,但是成本還是莊園那塊地。
- 環境標準化:
- 一次構建,隨處執行。實現執行環境的標準化發布,部署和運維。開發過程中一個常 見的問題是環境一致性問題。由于開發環境、測試環境、生產環境不一致,導致有些 bug 并未在開發過程中被發現。而 Docker 的鏡像提供了除內核外完整的運行時環境, 確保了應用運行環境一致性,從而不會再出現 「這段代碼在我機器上沒問題啊」 這類 問題。
- 資源彈性伸縮:
- 根據業務情況,動態調整計算、存儲、網絡等硬件及軟件資源。比如遇到雙 11 了,把 服務擴容 100 個,雙 11 過去了, 把擴容的 100 個收回去。
- 差異化環境提供:
- 同時提供多套差異化的執行環境,限制環境使用資源。 比如我的服務一個以來 Ubuntu 操作系統,一個服務依賴 CentOS 操作系統,但是沒 有預算購買兩個物理機,這個時候容器化就能很好的提供多種不同的環境。
- 沙箱安全:
- 為避免不安全或不穩定軟件對系統安全性、穩定性造成影響,可使用虛擬化技術構建 虛擬執行環境。 比如我在容器里面執行 rm -rf /* 不會把整個服務器搞死,也不影響其他人部署的程序 使用。
- 容器對比虛擬機更輕量,啟動更快:
- 傳統的虛擬機技術啟動應用服務往往需要數分鐘,而 Docker 容器應用,由于直接運 行于宿主內核,無需啟動完整的操作系統,因此可以做到秒級、甚至毫秒級的啟動時 間。大大的節約了開發、測試、部署的時間。 docker 不需要虛擬內核,所以啟動可以更快,相當于 windows 的開機時間省去了。
- 維護和擴展容易:
- Docker 使用的分層存儲以及鏡像的技術,使得應用重復部分的復用更為容易,也使得 應用的維護更新更加簡單,基于基礎鏡像進一步擴展鏡像也變得非常簡單。此外, Docker 團隊同各個開源項目團隊一起維護了一大批高質量的 官方鏡像,既可以直接 在生產環境使用,又可以作為基礎進一步定制,大大的降低了應用服務的鏡像制作成 本。比如 docker hub 提供了很多鏡像,各個系統的一個命令就可以拿到了,研發也可 以自己定制鏡像分享給各個產品。
?二? 虛擬化實現方式
1)應用程序執行環境分層
硬件層:提供硬件抽象,包括指令集架構、硬件設備及硬件訪問接口
操作系統層 :提供系統調用接口,管理硬件資源
程序庫層:提供數據結構定義及函數調用接口
2)虛擬化常見類別
1)虛擬機(相當于硬件層,給上邊幾層提供服務)
存在于硬件層和操作系統層間的虛擬化技術。虛擬機通過“偽造”一個硬件抽象接口, 將一個操作系統以及操作系統層以上的層嫁接到硬件上,實現和真實物理機幾乎一樣 的功能。比如我們在一臺 Windows 系統的電腦上使用 Android 虛擬機,就能夠用這臺 電腦打開 Android 系統上的應用。
2)容器(相當于操作系統層)
存在于操作系統層和函數庫層之間的虛擬化技術。容器通過“偽造”操作系統的接口, 將函數庫層以上的功能置于操作系統上。以 Docker 為例,其就是一個基于 Linux 操作 系統的 Namespace 和 Cgroup 功能實現的隔離容器,可以模擬操作系統的功能。簡單 來說,如果虛擬機是把整個操作系統封裝隔離,從而實現跨平臺應用的話,那么容器 則是把一個個應用單獨封裝隔離,從而實現跨平臺應用。所以容器體積比虛擬機小很多,理論上占用資源更少。容器化就是應用程序級別的虛擬化技術。容器提供了將應 用程序的代碼、運行時、系統工具、系統庫和配置打包到一個實例中的標準方法。容 器共享一個內核(操作系統),它安裝在硬件上。
3)JVM 之類的虛擬機(相當于函數庫層)
存在于函數庫層和應用程序之間的虛擬化技術。Java 虛擬機同樣具有跨平臺特性,所 謂跨平臺特性實際上也就是虛擬化的功勞。我們知道 Java 語言是調用操作系統函數庫 的,JVM 就是在應用層與函數庫層之間建立一個抽象層,對下通過不同的版本適應不 同的操作系統函數庫,對上提供統一的運行環境交給程序和開發者,使開發者能夠調 用不同操作系統的函數庫。
3)常見虛擬化實現
一)主機虛擬化(虛擬機)實現
主機虛擬化的原理是通過在物理服務器上安裝一個虛擬化層來實現。這個虛擬化層可 以在物理服務器和客戶操作系統之間建立虛擬機,使得它們可以獨立運行。 從軟件框架的角度上,根據虛擬化層是直接位于硬件之上還是在一個宿主操作系統之 上,將虛擬化劃分為 Type1 和 Type2. Type1 類的 Hypervisor(Hypervisor 是一種系統軟件,它充當計算機硬件和虛擬機之間 的中介,負責有效地分配和利用由各個虛擬機使用的硬件資源,這些虛擬機在物理主 機上單獨工作,因此,Hypervisor 也稱為虛擬機管理器。)直接運行在硬件之上,沒有 宿主機操作系統,Hypervisor 直接控制硬件資源和客戶機。典型框架為 Xen、Vmware ESX。
Type2 類的 Hypervisor 運行在一個宿主機操作系統之上(Vmware Workstation)或者 系統里面,Hypervisor 作為宿主機操作系統中的一個應用程序,客戶機就是在宿主機操 作系統上的一個進程。?
二)容器虛擬化實現
容器虛擬化實現原理:
容器虛擬化,有別于主機虛擬化,是操作系統層的虛擬化。通過 namespace 進行各程 序的隔離,加上 cgroups 進行資源的控制,以此來進行虛擬化。
容器虛擬化基礎之 NameSpace:
什么是 Namespace(命名空間)?
namespace 是 Linux 內核用來隔離內核資源的方式。通過 namespace 可以讓一些進 程只能看到與自己相關的一部分資源,而另外一些進程也只能看到與它們自己相關的 資源,這兩撥進程根本就感覺不到對方的存在。具體的實現方式是把一個或多個進程 的相關資源指定在同一個 namespace 中。
Linux namespaces 是對全局系統資源的一種封裝隔離,使得處于不同 namespace 的 進程擁有獨立的全局系統資源,改變一個 namespace 中的系統資源只會影響當前 namespace 里的進程,對其他 namespace 中的進程沒有影響。 Linux 提供了多個 API 用來操作 namespace,它們是 clone()、setns() 和 unshare() 函 數,為了確定隔離的到底是哪項 namespace,在使用這些 API 時,通常需要指定一些 調用參數:CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、 CLONE_NEWPID、CLONE_NEWUSER、CLONE_NEWUTS 和 CLONE_NEWCGROUP。如果要同時隔離多個 namespace,可以使用 | (按位或)組合 這些參數。
舉個例子:
三年一班的小明和三年二班的小明,雖說他們名字是一樣的,但是所在班級不一樣, 那么,在全年級排行榜上面,即使出現兩個名字一樣的小明,也會通過各自的學號來 區分。對于學校來說,每個班級就相當于是一個命名空間,這個空間的名稱是班級號。 班級號用于描述邏輯上的學生分組信息,至于什么學生分配到 1 班,什么學生分配到 2 班,那就由學校層面來統一調度。
理論講完了,接下來的實戰請看下一篇文章!!!