天天看點

第一章 初識Docker

第一章 初識Docker

<b>1.1 </b><b>什麼是Docker</b>

<b>Docker</b><b>開源項目</b>

Docker是基于Go語言實作的雲開源項目,誕生于2013年初,最初發起者是dotCloud公司。Docker自開源後受到廣泛的關注和讨論,目前已有多個相關項目,逐漸形成了圍繞Docker的生态體系。dotCloud公司後來也改名為Docker Inc,專注于Docker相關技術和産品的開發。

Docker項目目前已加入了Linux基金會,遵循Apache 2.0協定,全部開源代碼均在https://github.com/docker/docker上進行維護。在最近一次Linux基金會的調查中,Docker是僅次于OpenStack的最受歡迎的雲計算開源項目。

現在主流的Linux作業系統都已經支援Docker。例如,Redhat RHEL 6.5/ CentOS 6.5往上的作業系統、Ubuntu 14.04作業系統,都已經預設帶有Docker軟體包。Google公司宣稱在其PaaS(Platform

as a Service)平台及服務産品中廣泛應用了Docker。微軟公司宣布和 Docker公司合作,以加強其雲平台Azure對Docker的支援。公有雲提供商亞馬遜近期也推出了AWS EC2 Container,提供對Docker的支援。

Docker的主要目标是“Build, Ship and Run Any App, Anywhere”,即通過對應用元件的封裝(Packaging)、分發(Distribution)、部署(Deployment)、運作(Runtime)等生命周期的管理,達到應用元件級别的“一次封裝,到處運作”。這裡的應用元件,既可以是一個Web應用,也可以是一套資料庫服務,甚至是一個作業系統或編譯器。

Docker基于Linux的多項開源技術提供了高效、靈活和輕量級的容器方案,并且支援在多種主流雲平台(PaaS)和本地系統上部署。可以說Docker為應用的開發和部署提供了“一站式”的解決方案。

<b>Linux</b><b>容器技術</b>

Docker引擎的基礎是Linux容器(Linux Containers,LXC)技術。IBM DeveloperWorks上給出了關于容器技術的準确描述:

容器有效地将由單個作業系統管理的資源劃分到孤立的組中,以便更好地在孤立的組之間平衡有沖突的資源使用需求。與虛拟化相比,這樣既不需要指令級模拟,也不需要即時編譯。容器可以在核心CPU本地運作指令,而不需要任何專門的解釋機制。此外,也避免了準虛拟化(paravirtualization)和系統調用替換中的複雜性。

Linux容器其實不是一個全新的概念。最早的容器技術可以追溯到1982年Unix系列作業系統上的chroot工具(直到今天,主流的Unix、Linux作業系統仍然支援和帶有該工具)。早期的容器實作技術包括Sun Solaris作業系統上的Solaris Containers(2004年釋出),FreeBSD作業系統上的FreeBSD jail(2000年左右出現),以及GNU/Linux上的Linux-VServer

(http://linux-vserver.org/)(2001年10月)和OpenVZ (http://openvz.org)(2005年)。

雖然這些技術經過多年的演化已經十分成熟,但是由于種種原因,這些容器技術并沒有被內建到主流的Linux核心中,使用起來并不友善。例如,如果使用者要使用OpenVZ技術,就需要先給作業系統打上特定的核心更新檔方可使用。

後來LXC項目借鑒了前人成熟的容器設計理念,并基于一系列新的核心特性實作了更具擴充性的虛拟化容器方案。更加關鍵的是,LXC被內建到了主流Linux核心中,進而成為Linux系統輕量級容器技術的事實标準。

從Linux容器到Docker

在LXC的基礎上,Docker進一步優化了容器的使用體驗。Docker提供了各種容器管理工具(如分發、版本、移植等)讓使用者無需關注底層的操作,可以簡單明了地管理和使用容器。使用者操作Docker容器就像操作一個輕量級的虛拟機那樣簡單。

讀者可以簡單地将Docker容器了解為一種沙盒(Sandbox)。每個容器内運作一個應用,不同的容器互相隔離,容器之間也可以建立通信機制。容器的建立和停止都十分快速,容器自身對資源的需求也十分有限,遠遠低于虛拟機。很多時候,甚至直接把容器當作應用本身也沒有任何問題。

有理由相信,随着Docker技術的進一步成熟,它将成為更受歡迎的容器虛拟化技術實作,得到更廣泛的應用。

<b>1.2 </b><b>為什麼要使用Docker</b>

<b>Docker</b><b>容器虛拟化的好處</b>

Docker項目的發起人和Docker Inc.的CTO Solomon Hykes認為,Docker在正确的地點、正确的時間順應了正确的趨勢—即高效地建構應用。現在開發者需要能友善地建立運作在雲平台上的應用,也就是說應用必須能夠脫離底層機器,而且同時必須是“任何時間任何地點”可擷取的。是以,開發者們需要一種建立分布式應用程式的方式,這也是Docker所能夠提供的。

舉個簡單的應用場景的例子。假設使用者試圖基于最常見的LAMP(Linux + Apache + MySQL + PHP)組合來運維一個網站。按照傳統的做法,首先,需要安裝Apache、MySQL 和PHP以及它們各自運作所依賴的環境;之後分别對它們進行配置(包括建立合适的使用者、配置參數等);經過大量的操作後,還需要進行功能測試,看是否工作正常;如果不正常,則意味着更多的時間代價和不可控的風險。可以想象,如果再加上更多的應用,事情會變得更加難以處理。

更為可怕的是,一旦需要伺服器遷移(例如從阿裡雲遷移到騰訊雲),往往需要重新部署和調試。這些瑣碎而無趣的“體力活”,極大地降低了工作效率。

而Docker提供了一種更為聰明的方式,通過容器來打包應用,意味着遷移隻需要在新的伺服器上啟動需要的容器就可以了。這無疑将節約大量的寶貴時間,并降低部署過程出現問題的風險。

<b>Docker</b><b>在開發和運維中的優勢</b>

對開發和運維(DevOps)人員來說,可能最夢寐以求的就是一次性地建立或配置,可以在任意環境、任意時間讓應用正常地運作。而Docker恰恰是可以實作這一終極目标的瑞士軍刀。

具體說來,Docker在開發和運維過程中,具有如下幾個方面的優勢。

更快速的傳遞和部署。使用Docker,開發人員可以使用鏡像來快速建構一套标準的開發環境;開發完成之後,測試和運維人員可以直接使用相同環境來部署代碼。Docker可以快速建立和删除容器,實作快速疊代,大量節約開發、測試、部署的時間。并且,各個步驟都有明确的配置和操作,整個過程全程可見,使團隊更容易了解應用的建立和工作過程。

更高效的資源利用。Docker容器的運作不需要額外的虛拟化管理程式(Virtual Machine Manager,VMM,以及Hypervisor)支援,它是核心級的虛拟化,可以實作更高的性能,同時對資源的額外需求很低。

更輕松的遷移和擴充。Docker容器幾乎可以在任意的平台上運作,包括實體機、虛拟機、公有雲、私有雲、個人電腦、伺服器等。

這種相容性讓使用者可以在不同平台之間輕松地遷移應用。

更簡單的更新管理。使用Dockerfile,隻需要小小的配置修改,就可以替代以往大量的更新工作。并且所有修改都以增量的方式進行分發和更新,進而實作自動化并且高效的容器管理。

Docker與虛拟機比較

作為一種輕量級的虛拟化方式,Docker在運作應用上跟傳統的虛拟機方式相比具有顯著優勢:

Docker容器很快,啟動和停止可以在秒級實作,這相比傳統的虛拟機方式要快得多。

Docker容器對系統資源需求很少,一台主機上可以同時運作數千個Docker容器。

Docker通過類似Git的操作來友善使用者擷取、分發和更新應用鏡像,指令簡明,學習成本較低。

Docker通過Dockerfile配置檔案來支援靈活的自動化建立和部署機制,提高工作效率。

Docker容器除了運作其中的應用之外,基本不消耗額外的系統資源,保證應用性能的同時,盡量減小系統開銷。傳統虛拟機方式運作N個不同的應用就要啟動N個虛拟機(每個虛拟機需要單獨配置設定獨占的記憶體、磁盤等資源),而Docker隻需要啟動N個隔離的容器,并将應用放到容器内即可。

當然,在隔離性方面,傳統的虛拟機方式多了一層額外的隔離。但這并不意味着Docker就不安全。Docker利用Linux系統上的多種防護機制實作了嚴格可靠的隔離。從1.3版本開始,Docker引入了安全選項和鏡像簽名機制,極大地提高了使用Docker的安全性。

下表總結了使用Docker容器技術與傳統虛拟機技術的特性比較。

特性

容器

虛拟機

啟動速度

秒級

分鐘級

硬碟使用

一般為MB

一般為GB

性能

接近原生

弱于

系統支援量

單擊支援上千個容器

一般幾十個

隔離性

安全隔離

完全隔離

<b>1.3 </b><b>虛拟化與Docker</b>

虛拟化技術是一個通用的概念,在不同領域有不同的了解。在計算領域,一般指的是計算虛拟化(Computing Virtualization),或通常說的伺服器虛拟化。維基百科上的定義如下:

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

可見,虛拟化的核心是對資源進行抽象,目标往往是為了在同一個主機上運作多個系統或應用,進而提高系統資源的使用率,同時帶來降低成本、友善管理和容錯容災等好處。

從大類上分,虛拟化技術可分為基于硬體的虛拟化和基于軟體的虛拟化。其中,真正意義上的基于硬體的虛拟化技術不多見,少數如網卡中的單根多IO虛拟化(Single Root I/O Virtualization and

Sharing Specification,SR-IOV)等技術,也超出了本書的讨論範疇。

基于軟體的虛拟化從對象所在的層次,又可以分為應用虛拟化和平台虛拟化(通常說的虛拟機技術即屬于這個範疇)。其中,前者一般指的是一些模拟裝置或Wine這樣的軟體。後者又可以細分為如下幾個子類:

完全虛拟化。虛拟機模拟完整的底層硬體環境和特權指令的執行過程,客戶作業系統無需進行修改。例如VMware Workstation、VirtualBox、QEMU等。

硬體輔助虛拟化。利用硬體(主要是CPU)輔助支援(目前x86體系結構上可用的硬體輔助虛拟化技術包括Intel-VT和AMD-V)處理敏感指令來實作完全虛拟化的功能,客戶作業系統無需修改,例如VMware

Workstation、Xen、KVM。

部分虛拟化。隻針對部分硬體資源進行虛拟化,客戶作業系統需要進行修改。現在有些虛拟化技術的早期版本僅支援部分虛拟化。

超虛拟化(Paravirtualization)。部分硬體接口以軟體的形式提供給客戶機作業系統,客戶作業系統需要進行修改,例如早期的Xen。

作業系統級虛拟化。核心通過建立多個虛拟的作業系統執行個體(核心和庫)來隔離不同的程序。容器相關技術即在這個範疇。

可見,Docker以及其他容器技術都屬于作業系統的虛拟化這個範疇。

Docker虛拟化方式之是以擁有衆多優勢,這跟作業系統的虛拟化自身的特點是分不開的。下面圖1-1比較了Docker和常見的虛拟機方式的不同之處。

第一章 初識Docker

傳統方式是在硬體層面實作虛拟化,需要有額外的虛拟機管理應用和虛拟機作業系統層。

    Docker容器是在作業系統層面上實作虛拟化,直接複用本地主機的作業系統,是以更加輕量級。

繼續閱讀