1. 程式人生 > >虛擬化技術與Docker

虛擬化技術與Docker

人們為了提高系統及硬體資源的利用率而引入了虛擬化技術。虛擬化是一種資源管理技術,它可以各種實體資源抽像後再分隔,從而打破實體結構的限制,最大程度的提高資源的利用率。從實現形式來分,虛擬化技術分為硬體虛擬化技術和軟體虛擬化技術。而Docker屬於軟體虛擬化技術中的作業系統層虛擬化技術,它是基於LXC實現的一個應用容器引擎,Docker讓開發者可以打包他們的應用及依賴環境到一個可移植的容器中,然後可以將這個容器快速部署開發、測試或生產環境中。

1. 虛擬化技術

1.1 什麼是虛擬化

在計算機技術中,虛擬化(Virtualization)是一種資源管理技術。它是將計算機的各種實體資源,如:伺服器、網路、記憶體及儲存等,予以抽象、轉換後呈現出來,打破實體結構間的不可切割的障礙,使使用者可以用更好的方式來利用這些資源。

虛擬化的目的是為了在同一個主機上執行多個系統或應用,從而提高系統資源的利用率,並帶來降低成本、方便管理和容錯容災等好處。

1.2 虛擬化技術分類

從實現形式來分,虛擬化技術可分為基於硬體的虛擬化和基於軟體的虛擬化。

硬體虛擬化

硬體虛擬化就是硬體物理平臺本身提供了對特殊指令的截獲和重定向的支援。支援虛擬化的硬體,也是一些基於硬體實現軟體虛擬化技術的關鍵。在基於硬體實現軟體虛擬化的技術中,在硬體是實現虛擬化的基礎,硬體(主要是CPU)會為虛擬化軟體提供支援,從而實現硬體資源的虛擬化。

支援虛擬化的硬體有:

  • Intel-VT-(Intel Virtualization Technology),Intel公司為解決純軟體虛擬化解決方案在可靠性、安全性和效能上的不足而引進的技術。它可以讓一個CPU工作起來像多個CPU在並行執行,從而使得在一部電腦內同時執行多個作業系統成為可能
  • AMD-V-(AMD Virtualization),是AMD公司的虛擬化技術。它是對x86處理器系統架構的一組硬體擴充套件和硬體輔助虛擬化技術,可以簡化純軟體的虛擬化解決方案,改進VMM(虛擬機器監視器)的設計,更充分地利用硬體資源,提高伺服器和資料中心的虛擬化效率

軟體虛擬化

軟體虛擬化就是利用軟體技術,在現有的物理平臺上實現對物理平臺訪問的截獲和模擬。在軟體虛擬化技術中,有些技術不需要硬體支援,如:QEMU;而有些軟體虛擬化技術,則依賴硬體支援,如:VMware、KVM。

對軟體虛擬化進行細分,又可以分為以下幾類:

  • 完全虛擬化:(Full Virtualization)虛擬機器模擬完整的底層硬體環境和特權指令的執行過程,使客戶機作業系統可以獨立執行。支援完全虛擬化的軟體有:Parallels Workstation、VirtualBox、Virtual Iron、Oracle VM、Virtual PC、Virtual Server、Hyper-V、VMware Workstation、QEMU等
  • 硬體輔助虛擬化:(Hardware-assisted Virtualization)是指通過硬體輔助支援模擬執行環境,使客戶機作業系統可以獨立執行,實現完全虛擬化的功能。支援硬體輔助虛擬化的軟體有:Linux KVM、VMware Workstation、VMware Fusion、Virtual PC、Xen、VirtualBox、Parallels Workstation等
  • 部分虛擬化:(Partial Virtualization)只針對部分硬體資源進行虛擬化,虛擬機器模擬部分底層硬體環境,特別是地址空間。這樣的環境支援資源共享和執行緒獨立,但是不允許建立獨立的客戶機作業系統。
  • 平行虛擬化:(Para-Virtualization)虛擬機器不需要模擬硬體,而是將部分硬體介面以軟體的形式提供給客戶機作業系統。如:早期的Xen。
  • 作業系統層虛擬化:(OS-level virtualization)這種技術將作業系統核心虛擬化,可以允許使用者空間軟體例項被分割成幾個獨立的單元,在核心中執行,而不是隻有一個單一例項執行。這個軟體例項,也被稱為是一個容器(containers)、虛擬引擎(Virtualization engine)、虛擬專用伺服器(virtual private servers)。每個容器的程序是獨立的,對於使用者來說,就像是在使用自己的專用伺服器。

    Docker容器技術就是屬於作業系統層虛擬化的範疇。

1.3 幾種虛擬化技術

虛擬化是通過軟體的方式模擬實體伺服器,其初衷是為了解決“一種應用佔用一臺伺服器”模式所帶來的伺服器數量劇增的問題,從而降低資料中心複雜度,簡化管理難度。在虛擬化的發展過程中,出現過以下主要虛擬化技術或產品:

  • Xen - 由劍橋大學開發的,一款開源的虛擬機器監視器。採用ICA協議,它通過一種叫做準虛擬化的技術來獲取高效能,甚至在一些與傳統虛擬技術極度不友好的架構上(如:x86),Xen也有極佳的表現。Xen屬於半虛擬化的技術,所以其效能損失非常小。Xen沒有指令翻譯,其或者使用使能理解和翻譯虛擬作業系統發出的未修改指令的CPU(即:完全虛擬化);或者修改作業系統,使它發出的指令最優化,便於在虛擬化環境中執行(即:準虛擬化)。
  • KVM - KVM是一個Linux kernel模組,可以使用modprobe來載入KVM,載入後還需要通過其他工具建立虛擬機器。KVM是一個全虛擬化的解決方案,但需要CPU支援虛擬化功能。相比Xen來說,KVM可以更加方便的整合進Linux核心,但它還需要其它虛擬化軟體(如:QEMU)才能實現虛擬化功能。
  • LXC - 即:Linux Container,Linux容器,是一種輕量級的虛擬化的手段。它可以提供輕量級的虛擬化,以隔離程序和資源,而且不需要提供指令解釋機制以及全虛擬化的其他複雜性。容器會有效地將由單個作業系統管理的資源劃分到孤立的組中,以更好地在孤立的組之間平衡有衝突的資源使用需求。
  • OpenVZ - 是SWsoft公司開發的開源軟體,是該公司Virtuozzo軟體的基礎產品,是基於Linux平臺的作業系統級伺服器虛擬化解決方案。通過OpenVZ,可以在單個物理伺服器上建立多個相互隔離的虛擬專用伺服器(VPS)並以最大的效率共享硬體和管理資源。其上執行虛擬伺服器被稱為VPS(Virtual Private Serve),每個VPS的執行環境和獨立伺服器完全一致。OpenVZ基於Linux系統核心及作業系統提供作業系統級虛擬化,在虛擬化過程中資源消耗非常小,官方宣稱約1-2%。
  • Hyper-V - 是微軟體推出的一種虛擬化技術,可以採用半虛擬化或全虛擬的方式建立虛擬機器。雖然它可以建立Windows或Linux作業系統,但其本身只能執行在Windows系統下,使用範圍較為有限。
  • Oracle VM - Oracle推出的伺服器虛擬化軟體,基於開源的Xen技術,包括Oracle VM ServerOracle VM Manager兩部分。
  • VMWare - 是一家非常出名虛擬化軟體公司,其產品涵蓋伺服器、桌面等各種虛擬化領域,如:
    • VMware Workstation - 是一款桌面虛擬機器軟體,可以在一臺實體機器上模擬完整的網路環境,並可執行多個Windows、DOS、Linux或Mac系統,是非常好的開發、測試、部署解決方案。從技術角度來說,VMware Workstation是一款完全虛擬化產品,可藉助硬體輔助在不修改使用者作業系統的情況下完整虛擬化作業系統。
    • VMware ESX Server - 是一款適用於任何系統環境的企業級的虛擬機器軟體,可以認為是VMware Server的升級版。相比VMware Workstation來說,其功能更加強大,可以用於構建高伸縮和高可靠企業級伺服器,並可實現遠端管理、高階資源管理控制等高階功能。

2. Docker虛擬化

2.1 什麼是Docker

Docker是一個開源的應用容器引擎,它讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到安裝了任何 Linux 發行版本的機器上。Docker基於LXC來實現類似VM的功能,可以在更有限的硬體資源上提供給使用者更多的計算資源。與同VM等虛擬化的方式不同,LXC不屬於全虛擬化、部分虛擬化或半虛擬化中的任何一個分類,而是一個作業系統級虛擬化。

Docker是直接執行在宿主作業系統之上的一個容器,使用沙箱機制完全虛擬出一個完整的操作,容器之間不會有任何介面,從而讓容器與宿主機之間、容器與容器之間隔離的更加徹底。每個容器會有自己的許可權管理,獨立的網路與儲存棧,及自己的資源管理能,使同一臺宿主機上可以友好的共存多個容器。

Docker藉助Linux的核心特性,如:控制組(Control Group)、名稱空間(Namespace)等,並直接呼叫作業系統的系統呼叫介面。從而降低每個容器的系統開銷,並實現降低容器複雜度、啟動快、資源佔用小等特徵。

2.2 Docker的構成

2.2.1 Docker架構

Docker使用客戶端-伺服器 (C/S) 架構模式 使用遠端API來管理和建立Docker容器。Docker 容器(Container)通過 Docker 映象(Image)來建立,二者之間的關係類似於面向物件程式設計中的物件與類。

其中,Docker客戶端用於向Docker伺服器或守護程序傳送請求。而伺服器或守護程序會接受來自客戶的請求(建立、執行、分發容器),並在處理完請求後返回響應結果。Docker提供了一個命令列工具docker,及一整套RESTful API。客戶端和服務端既可以執行在一個機器上,也可通過 socket或者RESTful API來進行通訊。

Docker 架構

2.2.2 Docker核心元件

Docker Image(映象)、Registry(倉庫)、Docker Container(容器)是Docker中包含幾個核心元件(核心概念),這幾個元件介紹如下:

Docker Image - 映象

映象用於構建Docker容器,是構成Docker的基礎。它類似於虛擬機器中的映象,但它非常小,可以將它理解為容器的原始碼。是一種層式結構的增量檔案系統,由一系列命令一步步組成。

與傳統虛擬機器中的映象相比,Docker映象是分層的,也更為輕量。你可以對其進行快速跌代,通過版本管理及增量的檔案系統,Docker提供了一套十分簡單的機制來建立和更新現有的映象,使用者甚至可以從網上下載一個已經現有的應用映象,再通過簡單的命令就可以直接使用。

Registry - 倉庫

RegistryDocker用於存放映象檔案倉庫,倉庫分為開放(Public)和私有(Private),其設計理念非常類似於程式碼倉庫Git

Docker Hub是Docker公司運營的Registry,也是最大的Docker倉庫,使用者可以在上面註冊帳號分享並儲存自己的映象。除Docker Hub外,還有很多第三方映象倉庫。如果不希望自己的映象被其它人看到,你甚至可以架設自己的私有倉庫,以增強安全性或滿足一些特殊需求。

注意:也可以將Repository認為是Docker倉庫,實際上二者區分並不嚴格。

Docker Container - 容器

容器是用於執行映象的沙箱環境,它是從映象建立的應用執行例項,可以將其啟動、開始、停止、刪除。而這些容器都是相互隔離、互不可見的。我們可以理解為:映象是Docker生命週期的打包和構建階段,而容器Docker的啟動和執行階段。

Docker借簽了集裝箱的設計概念,不同的是集裝箱運送的貨物,而Docker運送的是軟體。和集裝箱一樣,我們並不需要關心裡面裝的是什麼,只需要將應用按標準的形式裝進去,然後上傳到Registry,在需要使用它的伺服器下載部署即可。Docker容器可以非常方便的替換,且各個容器都有良好的通用性,易於分發和疊加。

2.3 Docker的適用範圍

正如前所述,Docker為容器提供了標準的隔離性,而各個容器本身就是一個標準的系統環境。因些,Docker非常適合構建服務塊,以下是Docker的一些應用場景:

  • 方便應用的自動化打包與部署 - 加速本地開發和構建流程,使其更加高效和輕量化。本地開發人員可以構建、執行並分享Docker容器。容器可以在開發環境中構建,然後輕鬆的提交到測試環境,並最終進入生產環境。
  • 建立輕量、私密的PAAS環境
  • 部署和擴充套件Web應用、資料庫與後臺服務 - 可以讓獨立服務在不同環境中得到相同的執行結果
  • 連續的整合/部署、測試自動化 - 開發者可以在本地構建執行或測試環境,而不是直接在生產環境中部署、測試。

Docker也並不是萬能的,其設計目的也並不是要成為KVM等的替代品。不可避免的,Docker也會有一些侷限性,如:

  • 基於Linux核心,所以只能運行於Linux環境中,且只能64位主機上
  • 基於LXC實現的容器,而LXC是基於Linux核心中的cgroup。因此,Docker容器使用的許可權、物理資源等也受限於LXC