1. 程式人生 > >docker筆記01:docker預備知識

docker筆記01:docker預備知識

1. 虛擬化

1.1 虛擬化概念

虛擬化,是指通過虛擬化技術將一臺計算機虛擬為多臺邏輯計算機。在一臺計算機上同時執行多個邏輯計算機,每個邏輯計算機可執行不同的作業系統,並且應用程式都可以在相互獨立的空間內執行而互不影響,從而顯著提高計算機的工作效率。

虛擬化使用軟體的方法重新定義劃分IT資源,可以實現IT資源的動態分配、靈活排程、跨域共享,提高IT資源利用率,使IT資源能夠真正成為社會基礎設施,服務於各行各業中靈活多變的應用需求。

虛擬化的主要目的是對IT基礎設施進行簡化。它可以簡化對資源以及對資源管理的訪問。
消費者可以是一名終端使用者、應用程式、訪問資源或與資源進行互動的服務。

資源是一個提供一定功能的實現,它可以基於標準的介面接受輸入和提供輸出。資源可以是硬體,例如伺服器、磁碟、網路、儀器;也可以是軟體,例如Web 服務。

虛擬化支援的作業系統有:Windows和Linux各種系統。

1.2 虛擬化型別

從虛擬化的層次劃分,主要分為軟體輔助的虛擬化和硬體輔助的虛擬化。

(1)軟體輔助虛擬化:通過軟體的方法,讓客戶機的特權指令陷入異常,從而觸發宿主機進行虛擬化。主要使用的技術就是優先順序壓縮和二進位制程式碼翻譯。

(2)硬體輔助虛擬化:是指在 CPU 中加入新的指令集和處理器執行模式,完成虛擬化作業系統對硬體資源的的直接呼叫。典型技術指的是 Intel VT,AMD-V。

從虛擬平臺角度分為全虛擬化和半虛擬化。

(1)全虛擬化(Full Virtualization):全虛擬化是指虛擬機器模擬了完整的底層硬體,包括處理器、實體記憶體、時鐘、外設等,使得為原始硬體設計的作業系統或其它系統軟體完全不做任何修改就可以在虛擬機器中執行。作業系統與真實硬體之間的互動可以看成是通過一個預先規定的硬體介面進行的。全虛擬化 VMM 以完整模擬硬體的方式提供全部介面(同時還必須模擬特權指令的執行過程)。

全虛擬化不需要更改 Guest OS,相容性好。典型的代表有 Vmware WorkStation,ESX Server 早期版本,Microsoft Virtrual Server。

(2)半虛擬化(Paravirtualization):半虛擬化通過修改 Guest OS 部分訪問特權狀態的程式碼以便直接與 VMM 直接互動。在半虛擬化虛擬機器中,部分硬體介面以軟體的形式提供給客戶機作業系統,這可以通過 Hypercall(VMM 提供給 Guest OS 的直接呼叫,與系統呼叫類似)的方式來提供,所以也被稱為超虛擬化。

例如,Guest OS 把切換頁表的程式碼修改為呼叫 Hypercall 來直接完成修改影子 CR3 暫存器和翻譯地址的工作。

依靠這些指令可以直接通過 Hypervisor 層呼叫硬體資源,從而免除了 Hypervisor 層轉換指令的開銷,由於不需要產生額外的異常和模擬部分硬體執行流程,半虛擬化可以大幅度提高效能,半虛擬化的典型代表有 Microsoft Hyper-V,Vmware 的 vSphere。

(3)硬體輔助虛擬化(Hardware-Assisted Virtualization) :指藉助硬體(主要是主機處理器)的支援來實現高效的全虛擬化。例如有了 Intel-VT 技術的支援,Guest OS 和 VMM 的執行環境自動地完全隔離開來,Guest OS 有自己的“全套暫存器”,可以直接執行在最高級別。因此在上面的例子中,Guest OS 能夠執行修改頁表的彙編指令。Intel-VT 和 AMD-V 是目前 x86 體系結構上可用的兩種硬體輔助虛擬化技術。

從虛擬化 VMM 的實現結構來看,可以分為裸金屬虛擬化,宿主型虛擬化和混合虛擬化,接下來咱們分別詳細介紹一下。

(1)裸金屬型虛擬化(也叫 Hypervisor 虛擬化、裸機或 I 型):指直接在底層硬體上安裝VMM 作為 Hypervisor 接管,Hypervisor 將負責管理所有的資源和虛擬環境支援。

該模型中,VMM 可以看作一個為虛擬化而生的完整的作業系統,掌控有所有資源(CPU,記憶體,I/O 裝置)。VMM 承擔管理資源的重任,其還需向上提供 VM 用於執行 Guest OS,因此 VMM 還負責虛擬環境的建立和管理。

它主要實現兩個基本功能,其一是識別、捕獲和響應虛擬機器所發出的 CPU 特權指令或保護指令;其二是負責處理虛擬機器佇列和排程,並將物理硬體的處理結果返回給相應的虛擬機器。這種結構問題是,硬體裝置多種多樣,VMM 不能把所有的裝置驅動都一一實現,所以此模型支援有限的裝置。如下圖所示:
這裡寫圖片描述
優點:因 VMM 同時具有物理資源的管理功能和虛擬化功能,故虛擬化的效率會較高;安全性方面,VM 的安全只依賴於 VMM 的安全。

缺點:因 VMM 完全擁有物理資源,因此,VMM 需要進行物理資源的管理,包括裝置的驅動,而裝置驅動的開發工作量是很大的,這對 VMM 是個很大的挑戰。

採用該結構的 VMM 有:VMWare ESX Server, WindRiver Hypervisor, KVM(後期)。

(2)宿主模型虛擬化(OS-hosted,也叫寄居虛擬化或 II 型):此模型的物理資源由 Host OS(例如 Windows, Linux etc.)管理,實際的虛擬化功能由 VMM 提供,其通常是 Host OS 的獨立核心模組(有的實現還含使用者程序,如負責 I/O 虛擬化的使用者態裝置模型)。VMM 通過呼叫 Host OS 的服務來獲得資源,實現 CPU,記憶體和 I/O 裝置的虛擬化。VMM 創建出 VM 後,通常將 VM 作為 Host OS 的一個程序參與排程。如下圖所示:
這裡寫圖片描述
如上圖所示,VMM 模組負責 CPU 和記憶體虛擬化,由 ULM 請求 Host OS 裝置驅動,實現 I/O 裝置的虛擬化。

優點:可以充分利用現有 OS 的裝置驅動,VMM 無需自己實現大量的裝置驅動,輕鬆實現 I/O 裝置的虛擬化。

缺點:因資源受 Host OS 控制,VMM 需呼叫 Host OS 的服務來獲取資源進行虛擬化,其效率和功能會受到一定影響。

採用該結構的 VMM 有:VMware Workstation,VMWare Server (GSX),Virtual PC,Virtual Server,KVM(早期)。

(3)混合模型虛擬化(Hybrid,也叫作業系統虛擬化或容器型):就是以上兩種模型的混合,這種模型沒有獨立的 Hypervisor 層。相反,主機作業系統本身就負責在多個虛擬伺服器之間分配硬體資源,並且讓這些伺服器彼此獨立。

如果使用作業系統層虛擬化,所有虛擬伺服器必須運行同一作業系統(不過每個例項有各自的應用程式和使用者賬戶),虛擬機器執行在傳統作業系統上,建立一個獨立的虛擬化例項,指向底層託管作業系統,VMM 直接管理硬體,但是會讓出一定的裝置的控制權,交給執行在特權上的虛擬機器來管理。VMM 只負責 CPU 和記憶體的虛擬化,I/O 裝置的虛擬化由 VMM 和特權 OS 共同完成。
這裡寫圖片描述
優點:可利用現有 OS 的 I/O 裝置驅動;VMM 直接控制 CPU 和記憶體等物理資源,虛擬化效率較高;若對特權 OS 的許可權控制得當,虛擬機器的安全性只依賴於 VMM。

缺點:因特權 OS 運行於 VM 上,當需要特權 OS 提供服務時,VMM 需要切換到特權 OS,這裡面就產生上下文切換的開銷和效能降低。

採用該結構的 VMM 有:Xen,SUN Logical Domain。

從虛擬化在雲端計算的應用領域進行劃分,可分為伺服器虛擬化(即計算虛擬化),網路虛擬化,儲存虛擬化,應用程式虛擬化,平臺虛擬化,桌面虛擬化。

(1)伺服器虛擬化:就是將一臺伺服器虛擬成多臺伺服器進行使用,伺服器虛擬化是基礎架構即服務(IaaS)的基礎。

(2)網路虛擬化:籠統來講,包括VLAN、VPN、VPLS、MPLS、LISP、Virtual routers、VRFs 等在內的都可以認為是網路虛擬化的某種表現形式。但當前新興的網路虛擬化概念從深度、廣度和影響上都遠遠超過了以上的技術。網路虛擬化簡單說就是把網路層的一些功能從硬體中剝離出來,新建立所謂的網路虛擬層。

(3)儲存虛擬化:簡單來說就是將整個雲系統的儲存資源進行統一整合管理,再為不同使用者分配各自的儲存空間。

(4)應用程式虛擬化:簡單來說就是把應用程式對底層硬體系統和硬體的依賴抽象出來,從而解除應用程式與 OS 和硬體的耦合關係。應用程式執行在本地應用的虛擬化環境中,這個環境為應用程式遮蔽了底層可能和其他應用產生衝突的內容。應用程式虛擬化是(SaaS)的基礎。

(5)平臺虛擬化:是整合各種開發資源虛擬出的一個面向開發人員的統一介面,軟體開發人員可以方便的在這個平臺上開發各種應用並嵌入雲端計算中,使其成為新的雲服務供給使用者使用。

(6)桌面虛擬化:將使用者的桌面環境與其使用的終端裝置進行解耦。伺服器上的存放每個人的完整桌面環境。使用者可以使用具有足夠處理功能和顯示功能的不同終端裝置通過網路訪問該桌面。

2. 雲端計算的分類

  1. IAAS: 使用者通過Internet 可以從完善的計算機基礎設施獲得服務。這類服務可以稱為基礎設施即服務。
  2. PAAS:提供了使用者可以訪問的完整或部分的應用程式開發,這類服務可以稱為平臺即服務。
  3. SAAS:提供了使用者可以訪問的完整的可直接使用的應用程式,這類服務可以稱為軟體即服務。

如果把他們看作層次結構,那麼第一層自然叫做IAAS,第二層就是PAAS,第三層也就是SAAS。

下面簡單舉一個例子:吃貨如何吃到披薩。

  • 方式一:自己在家做(本地部署On-Premises
  • 方式二:買好速食披薩回家自己做著吃(基礎設施即服務-IAAS
  • 方式三:打電話叫外賣將披薩送到家中(平臺即服務-PAAS
  • 方式四:直接在披薩店吃披薩(軟體即服務-SAAS

現在我們從披薩中回到雲端計算的概念來。假設你是一家超級牛逼的技術公司,根本不需要別人提供服務,你擁有基礎設施、應用等等其它一切,你把它們分為三層:基礎設施(infrastructure)、平臺(platform)和軟體(software)。這其實就是雲端計算的三個分層,基礎設施在最下端,平臺在中間,軟體在頂端,分別是Infrastructure-as-a-Service(IAAS)Platform-as-a-Service(PAAS)Software-as-a-Service(SAAS)

如果你的公司什麼都有,現在所處的狀態叫本地部署(On-Premises),就像在自己家做披薩一樣。如果你想在辦公室或者公司的網站上執行一些企業應用,你需要去買伺服器,或者別的高昂的硬體來控制本地應用,讓你的業務執行起來,這就叫本地部署。

假如你突然有一天想明白了,只是為了吃上披薩,為什麼非要自己做呢?於是,準備考慮一家雲服務供應商,這個雲服務供應商能提供哪些服務呢?其所能提供的雲服務也就是雲端計算的三個分層:PAAS、IAAS和SAAS,就像披薩店提供三種服務:買成品回家做、外賣和到披薩店吃

IAAS:公共的和私有的。Amazon EC2在基礎設施雲中使用公共伺服器池。更加私有化的服務會使用企業內部資料中心的一組公用或私有伺服器池。如果在企業資料中心環境中開發軟體,那麼這兩種型別都能使用,而且使用EC2臨時擴充套件資源的成本也很低,比方說測試,結合使用兩者可以更快地開發應用程式和服務,縮短開發和測試周期。
一些大的IAAS公司包括Amazon, Microsoft, VMWare, Rackspace和Red Hat.不過這些公司又都有自己的專長,比如Amazon和微軟給你提供的不只是IAAS,他們還會將其計算能力出租給你來host你的網站。Openstack做的就是IAAS平臺。

PAAS:Platform-as-a-Service(平臺即服務),第二層就是所謂的PAAS,某些時候也叫做中介軟體。你公司所有的開發都可以在這一層進行,節省了時間和資源。PAAS公司在網上提供各種開發和分發應用的解決方案,比如虛擬伺服器和作業系統。這節省了你在硬體上的費用,也讓分散的工作室之間的合作變得更加容易。網頁應用管理,應用設計,應用虛擬主機,儲存,安全以及應用開發協作工具等。一些大的PAAS提供者有Google App Engine,Microsoft Azure,Force.com,Heroku,Engine Yard。最近興起的公司有AppFog,Mendix和Standing Cloud。docker做的就是PAAS平臺

SAAS:Software-as-a-Service(軟體即服務),第三層也就是所謂SAAS。這一層是和你的生活每天接觸的一層,大多是通過網頁瀏覽器來接入。任何一個遠端伺服器上的應用都可以通過網路來執行,就是SAAS了。你消費的服務完全是從網頁如Netflix,MOG,Google Apps,Box.net,Dropbox或者蘋果的iCloud那裡進入這些分類。儘管這些網頁服務是用作商務和娛樂或者兩者都有,但這也算是雲技術的一部分。一些用作商務的SaaS應用包括Citrix的Go To Meeting,Cisco的WebEx,Salesforce的CRM,ADP,Workday和SuccessFactors。

3. 名詞解釋

KVM:

KVM是linux核心的模組,它需要CPU的支援,採用硬體輔助虛擬化技術Intel-VT,AMD-V,記憶體的相關如Intel的EPT和AMD的RVI技術,Guest OS的CPU指令不用再經過Qemu轉譯,直接執行,大大提高了速度,KVM通過/dev/kvm暴露介面,使用者態程式可以通過ioctl函式來訪問這個介面。

QEMU:

Qemu是一個模擬器,它向Guest OS模擬CPU和其他硬體,Guest OS認為自己和硬體直接打交道,其實是同Qemu模擬出來的硬體打交道,Qemu將這些指令轉譯給真正的硬體。
QEMU
由於所有的指令都要從Qemu裡面過一手,因而效能較差。

QEMU-KVM:

Qemu將KVM整合進來,通過ioctl呼叫/dev/kvm介面,將有關CPU指令的部分交由核心模組來做。kvm負責cpu虛擬化+記憶體虛擬化,實現了cpu和記憶體的虛擬化,但kvm不能模擬其他裝置。qemu模擬IO裝置(網絡卡,磁碟等),kvm加上qemu之後就能實現真正意義上伺服器虛擬化。因為用到了上面兩個東西,所以稱之為qemu-kvm。
這裡寫圖片描述
Qemu模擬其他的硬體,如Network, Disk,同樣會影響這些裝置的效能,於是又產生了pass through半虛擬化裝置virtio_blk, virtio_net,提高裝置效能。

libvirt:

libvirt是目前使用最為廣泛的對KVM虛擬機器進行管理的工具和API。Libvirtd是一個daemon程序,可以被本地的virsh呼叫,也可以被遠端的virsh呼叫,Libvirtd呼叫qemu-kvm操作虛擬機器。
這裡寫圖片描述

openstack

OpenStack是一個由NASA(美國國家航空航天局)和Rackspace合作研發併發起的,以Apache許可證授權的自由軟體和開放原始碼專案。
OpenStack是一個開源的雲端計算管理平臺專案,由幾個主要的元件組合起來完成具體工作。OpenStack支援幾乎所有型別的雲環境,專案目標是提供實施簡單、可大規模擴充套件、豐富、標準統一的雲端計算管理平臺。OpenStack通過各種互補的服務提供了基礎設施即服務(IaaS)的解決方案,每個服務提供API以進行整合。
OpenStack主要用於企業部署私有云上。

Openstack與KVM

OpenStack幾乎支援所有的虛擬化管理程式,不論是開源的(Xen與KVM)還是廠商的(Hyper-V與VMware)。但在以前,OpenStack是基於KVM開發的,KVM常常成為預設的虛擬機器管理程式。兩者都使用相同的開放源理念與開發方法。

QEMU-KVM就是一個完整的模擬器,它是構建基於KVM上面的,它提供了完整的網路和I/O支援。

Openstack不會直接控制qemu-kvm,它會用一個叫libvirt的庫去間接控制qemu-kvm。libvirt提供了跨VM平臺的功能,它可以控制除了QEMU之外的模擬器,包括vmware, virtualbox, xen等等。

所以為了openstack的跨VM性,只會用libvirt而不直接用qemu-kvm。libvirt還提供了一些高階的功能,例如pool/vol管理。

XEN

Xen是第一類執行在裸機上的虛擬化管理程式(Hypervisor)。它支援全虛擬化和半虛擬化,Xen支援hypervisor和虛擬機器互相通訊,而且提供在所有Linux版本上的免費產品,包括Red Hat Enterprise Linux和SUSE Linux Enterprise Server。Xen最重要的優勢在於半虛擬化,此外未經修改的作業系統也可以直接在xen上執行(如Windows),能讓虛擬機器有效執行而不需要模擬,因此虛擬機器能感知到hypervisor,而不需要模擬虛擬硬體,從而能實現高效能。

LXC

LXC是LinuX Container的簡稱,提供輕量級的虛擬化,是一種基於容器的作業系統層級的虛擬化技術。利用新版Linux核心的特性(Cgroups等)實現的無需hypervisor的輕型虛擬化技術。容器能有效的將由單個作業系統管理的資源劃分到孤立的組中,以更好地在孤立的組之間平衡有衝突的資源使用需求。

LXC能夠虛擬出一個完整的系統環境(rootfs),也可以僅為單個或多個應用程式提供虛擬化執行環境。從使用方式來看,它更像是增強版的chroot環境,提供一個擁有自己程序、網路空間的虛擬環境。

docker與lxc

Docker 專案的目標是實現輕量級的作業系統虛擬化解決方案。 Docker 的基礎是 Linux 容器(LXC)等技術。
在 LXC 的基礎上 Docker 進行了進一步的封裝,讓使用者不需要去關心容器的管理,使得操作更為簡便。使用者操作 Docker 的容器就像操作一個快速輕量級的虛擬機器一樣簡單。
LXC的特點需要通過Docker團隊來過載實現,使之在Docker中可用,比如LXC現在支援讓非根使用者建立和配置容器的未經授權容器,LXC現在還致力於實時遷移和多主機管理。這些對容器來說都是很大的進步,也為更好的安全性,多租戶工作量以及虛擬平價鋪平了道路。Docker還不支援這些。隨著最近的libcontainer宣告,推測兩者間的差距還將增大。

4. docker

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。
一個完整的Docker有以下幾個部分組成:

  • dockerClient客戶端
  • Docker Daemon守護程序
  • Docker Image映象
  • DockerContainer容器

4.1 docker的特性:

在docker的網站上提到了docker的典型場景:

  • Automating the packaging and deployment of applications(使應用的打包與部署自動化)
  • Creation of lightweight, private PAAS environments(建立輕量、私密的PAAS環境)
  • Automated testing and continuous integration/deployment(實現自動化測試和持續的整合/部署)
  • Deploying and scaling web apps, databases and backend services(部署與擴充套件webapp、資料庫和後臺服務)

由於其基於LXC的輕量級虛擬化的特點,docker相比KVM之類最明顯的特點就是啟動快,資源佔用小。因此對於構建隔離的標準化的執行環境,輕量級的PaaS(如dokku),構建自動化測試和持續整合環境,以及一切可以橫向擴充套件的應用(尤其是需要快速啟停來應對峰谷的web應用)。

  1. 構建標準化的執行環境,現有的方案大多是在一個baseOS上執行一套puppet/chef,或者一個image檔案,其缺點是前者需要base OS許多前提條件,後者幾乎不可以修改(因為copy on write 的檔案格式在執行時rootfs是read only的)。並且後者檔案體積大,環境管理和版本控制本身也是一個問題

  2. PaaS環境是不言而喻的,其設計之初和dotcloud的案例都是將其作為PaaS產品的環境基礎。

  3. 因為其標準化構建方法(buildfile)和良好的REST API,自動化測試和持續整合/部署能夠很好的整合進來
  4. 因為LXC輕量級的特點,其啟動快,而且docker能夠只加載每個container變化的部分,這樣資源佔用小,能夠在單機環境下與KVM之類的虛擬化方案相比能夠更加快速和佔用更少資源

4.2 docker的侷限:

Docker並不是全能的,設計之初也不是KVM之類虛擬化手段的替代品,簡單總結幾點:

  1. Docker是基於Linux 64bit的,無法在32bit的linux/Windows/unix環境下使用
  2. LXC是基於cgroup等linux kernel功能的,因此container的guest系統只能是linux base的。
  3. 隔離性相比KVM之類的虛擬化方案還是有些欠缺,所有container公用一部分的執行庫。
  4. 網路管理相對簡單,主要是基於namespace隔離
  5. cgroup的cpu和cpuset提供的cpu功能相比KVM的等虛擬化方案相比難以度量(所以dotcloud主要是按記憶體收費)
  6. Docker對disk的管理比較有限
  7. container隨著使用者程序的停止而銷燬,container中的log等使用者資料不便收集