虛擬化
要解釋清楚 Docker,首先要解釋清楚容器(Container)的概念。要解釋容器的話,就需要從操作系統(tǒng)說(shuō)起。操作系統(tǒng)太底層,細(xì)說(shuō)的話一兩本書都說(shuō)不清楚。這里就一句話來(lái)總結(jié)一下:操作系統(tǒng)(Operating System,簡(jiǎn)稱OS)是管理計(jì)算機(jī)硬件與軟件資源的計(jì)算機(jī)程序,并且為軟件運(yùn)行提供通用服務(wù)的系統(tǒng)軟件。
隨著硬件的性能提升,軟件種類的豐富,有兩種情況變得很常見(jiàn):
- 硬件性能過(guò)剩——很多計(jì)算機(jī)的硬件配置,往往會(huì)有大量時(shí)間處于硬件資源閑置的狀態(tài)。例如一般家用電腦,已經(jīng)是四核、六核的配置了,除了3A游戲、視頻制作、3D渲染、高性能計(jì)算等特殊應(yīng)用外,通常有 90% 以上時(shí)間 CPU 是閑置的;
- 軟件沖突——因?yàn)闃I(yè)務(wù)需要,兩個(gè)或者多個(gè)軟件之間沖突,或者需要同一個(gè)軟件的不同版本。例如早幾年做 Web 前端的,要測(cè)試網(wǎng)頁(yè)在不同版本的 IE 上是否能正常顯示,然而 windows 只能裝一個(gè)版本的 IE。
為了解決軟件沖突,只能配置多臺(tái)計(jì)算機(jī),或者很麻煩的在同一臺(tái)電腦上安裝多個(gè)操作系統(tǒng)。顯然這兩個(gè)方案都有其缺點(diǎn):多臺(tái)計(jì)算機(jī)成本太高,多操作系統(tǒng)的安裝、切換都很麻煩。在硬件性能過(guò)剩的時(shí)候,硬件虛擬化的普及就很自然而然的提出來(lái)了。
所謂硬件虛擬化,就是某個(gè)特殊的軟件,仿真出一臺(tái)或者多臺(tái)計(jì)算機(jī)的各種硬件,用戶可以在這一臺(tái)虛擬機(jī)上安裝、運(yùn)行操作系統(tǒng)(一般叫來(lái)賓操作系統(tǒng),Guest OS)和各種應(yīng)用,并且把 Guest OS 和上面應(yīng)用軟件對(duì)硬件資源的訪問(wèn)轉(zhuǎn)發(fā)到底層的硬件上來(lái)實(shí)現(xiàn)。
對(duì)于 Guest OS 和上面的應(yīng)用程序來(lái)說(shuō),這臺(tái)虛擬機(jī)和普通物理計(jì)算機(jī)是完全一樣沒(méi)有任何區(qū)別的——除了性能可能差一點(diǎn)。全球第一人氣的 VMware Workstation 就是這么一個(gè)軟件,Oracle 的 VirtualBox 以及 Microsoft 的 Virtual PC 都是。這類軟件英語(yǔ)有一個(gè)專用的單詞是 Hypervisor(虛擬機(jī)管理程序)。
虛擬機(jī)的優(yōu)點(diǎn)
可以把資源分配到不同的虛擬機(jī),達(dá)到硬件資源的最大化利用;
相比直接在物理機(jī)上部署應(yīng)用,虛擬機(jī)更容易擴(kuò)展應(yīng)用;
云服務(wù):通過(guò)虛擬機(jī)虛擬出不同的物理資源,可以快速搭建云服務(wù)。
虛擬化技術(shù)主要用來(lái)解決高性能的物理硬件產(chǎn)能過(guò)剩和老舊的硬件硬件產(chǎn)品產(chǎn)能過(guò)低的重組重用,透明化底層物理硬件,從而最大化的利用物理硬件。
虛擬機(jī)的缺點(diǎn)
虛擬機(jī)的缺點(diǎn)在于 Guest OS 通常會(huì)占用不少硬件資源。例如 Windows 安裝 VMware 并開(kāi)機(jī) Guest OS,不運(yùn)行任何應(yīng)用的情況下,就需要占用 2 ~ 3G 內(nèi)存,20 ~ 30G 硬盤空間。而且為了應(yīng)用系統(tǒng)運(yùn)行的性能,往往還要給每臺(tái)虛擬機(jī)留出更多的內(nèi)存容量。雖然不少 Hypervisor 支持動(dòng)態(tài)內(nèi)存,但基本上都會(huì)降低虛擬機(jī)的性能。在這樣的資源占用情況下,少量的虛擬機(jī)還是可以接受的,如果同時(shí)運(yùn)行十多臺(tái)或數(shù)十臺(tái)虛擬機(jī),硬件資源的浪費(fèi)就會(huì)成倍遞增。通常來(lái)說(shuō),其中相當(dāng)大一部分甚至全部 Guest OS 都是相同的。
能不能所有應(yīng)用使用同一個(gè)操作系統(tǒng)減少硬件資源的浪費(fèi),但是又能避免包括運(yùn)行庫(kù)在內(nèi)的軟件沖突呢?操作系統(tǒng)層虛擬化——容器概念的提出,就是為了解決這個(gè)問(wèn)題。Docker 就是一個(gè)容器的標(biāo)準(zhǔn)化實(shí)現(xiàn)。
容器化
容器技術(shù)已經(jīng)發(fā)展了很長(zhǎng)一段時(shí)間了,例如:LXC,BSD Jails,Solaris Zones...
容器化就是應(yīng)用程序級(jí)別的虛擬化技術(shù)。容器提供了將應(yīng)用程序的代碼、運(yùn)行時(shí)、系統(tǒng)工具、系統(tǒng)庫(kù)和配置打包到一個(gè)實(shí)例中的標(biāo)準(zhǔn)方法。容器共享一個(gè)內(nèi)核(操作系統(tǒng)),它安裝在硬件上。
和虛擬機(jī)相比,容器有以下優(yōu)點(diǎn):
- 啟動(dòng)迅速:沒(méi)有虛擬機(jī)硬件的初始化,沒(méi)有 Guest OS 的啟動(dòng)過(guò)程,可以節(jié)約很多啟動(dòng)時(shí)間,這就是容器的“開(kāi)箱即用”;
- 占用資源少:沒(méi)有運(yùn)行 Guest OS 所需的內(nèi)存開(kāi)銷,無(wú)需為虛擬機(jī)預(yù)留運(yùn)行內(nèi)存,無(wú)需安裝、運(yùn)行 App 不需要的運(yùn)行庫(kù)/操作系統(tǒng)服務(wù),內(nèi)存占用、存儲(chǔ)空間占用都小的多。相同配置的服務(wù)器,如果運(yùn)行虛擬機(jī)能運(yùn)行十多臺(tái)的,通??梢赃\(yùn)行上百個(gè)容器毫無(wú)壓力——當(dāng)然前提是單個(gè)容器應(yīng)用本身不會(huì)消耗太多資源。
Docker 歷史
2010 年,幾個(gè)搞 IT 的年輕人,在美國(guó)舊金山成立了一家名叫 dotCloud 的公司。dotCloud 的平臺(tái)即服務(wù)(Platform-as-a-Service, PaaS)提供商。底層技術(shù)上,dotCloud 平臺(tái)利用了 linux 的 LXC 容器技術(shù)。
為了方便創(chuàng)建和管理這些容器,dotCloud 基于 google 公司推出的 Go 語(yǔ)言開(kāi)發(fā)了一套內(nèi)部工具,之后被命名為 Docker。Docker 就是這樣誕生的。
LXC 是 Docker 的底層基石,但是在 Docker 0.9 版本的時(shí)候,Docker 見(jiàn)異思遷了,引入了基于 Go 語(yǔ)言構(gòu)建的 Libcontainer 的 execution driver。有了 Libcontainer 這個(gè)項(xiàng)目,Docker 不再需要依賴于 Linux 部件(LXC,libvirt,systemd-nspawn...)就可以處理 namespaces、control groups、capabilities、apparmor profiles、network interfaces。這下,LXC 淪為可選項(xiàng)。
在 Docker 1.8 中 LXC 被 deprecated,在 Docker 1.10,LXC 徹底出局。Docker 推出 Libcontainer 自己集成了 Linux 內(nèi)核中的很多特性,作為一個(gè)獨(dú)特、穩(wěn)定且不受制于 Linux 的 Library,獨(dú)立的時(shí)代終于到來(lái)了。
如同 Docker 的 Logo 一樣,Docker 的思想來(lái)源于集裝箱。集裝箱解決了什么問(wèn)題?在一艘大船上,可以把貨物規(guī)整的擺放起來(lái),并且各種各樣的貨物被集裝箱標(biāo)準(zhǔn)化,集裝箱與集裝箱之間互不影響。那么就不需要專門運(yùn)送水果的船和專門運(yùn)送化學(xué)用品的船了。只要這些貨物封裝在不同的集裝箱里,就可以用一艘大船把它們都運(yùn)走。
Docker 技術(shù)誕生之后,并沒(méi)有引起行業(yè)的關(guān)注。而 dotCloud 公司,作為一家小型創(chuàng)業(yè)企業(yè),在激烈的競(jìng)爭(zhēng)之下,也步履維艱。
正當(dāng)他們快要堅(jiān)持不下去的時(shí)候,腦子里蹦出了“開(kāi)源”的想法。什么是“開(kāi)源”?開(kāi)源,就是開(kāi)放源代碼。也就是將原來(lái)內(nèi)部保密的程序源代碼開(kāi)放給所有人,然后讓大家一起參與進(jìn)來(lái),貢獻(xiàn)代碼和意見(jiàn)。
有的軟件一開(kāi)始就是開(kāi)源的。也有的軟件,是混不下去,創(chuàng)造者又不想放棄,所以選擇開(kāi)源。自己養(yǎng)不活,就吃“百家飯”嘛。2013 年 3 月,dotCloud 公司的創(chuàng)始人之一,Docker 之父,28 歲的 Solomon Hykes 正式?jīng)Q定,將 Docker 項(xiàng)目開(kāi)源。
不開(kāi)則已,一開(kāi)驚人。越來(lái)越多的 IT 工程師發(fā)現(xiàn)了 Docker 的優(yōu)點(diǎn),然后蜂擁而至,加入 Docker 開(kāi)源社區(qū)。Docker 的人氣迅速攀升,速度之快,令人瞠目結(jié)舌。
開(kāi)源當(dāng)月, Docker 0.1 版本發(fā)布。此后的每一個(gè)月, Docker 都會(huì)發(fā)布一個(gè)版本。到 2014 年 6 月 9 日, Docker 1.0 版本正式發(fā)布。
此時(shí)的 Docker,已經(jīng)成為行業(yè)里人氣最火爆的開(kāi)源技術(shù),沒(méi)有之一。甚至像 Google、微軟、Amazon、 VMware 這樣的巨頭們都對(duì)它青睞有加,表示將全力支持。
Docker 火了之后, dotCloud 公司干脆把公司名字也改成了 Docker Inc. 。
為什么選擇 Docker
更高效的利用系統(tǒng)資源
由于容器不需要進(jìn)行硬件虛擬以及運(yùn)行完整操作系統(tǒng)等額外開(kāi)銷,Docker 對(duì)系統(tǒng)資源的利用率更高。無(wú)論是應(yīng)用執(zhí)行速度、內(nèi)存損耗或者文件存儲(chǔ)速度,都要比傳統(tǒng)虛擬機(jī)技術(shù)更高效。因此,相比虛擬機(jī)技術(shù),一個(gè)相同配置的主機(jī),往往可以運(yùn)行更多數(shù)量的應(yīng)用。
更快速的啟動(dòng)時(shí)間
傳統(tǒng)的虛擬機(jī)技術(shù)啟動(dòng)應(yīng)用服務(wù)往往需要數(shù)分鐘,而 Docker 容器應(yīng)用,由于直接運(yùn)行于宿主內(nèi)核,無(wú)需啟動(dòng)完整的操作系統(tǒng),因此可以做到秒級(jí)、甚至毫秒級(jí)的啟動(dòng)時(shí)間。大大的節(jié)約了開(kāi)發(fā)、測(cè)試、部署的時(shí)間。
一致的運(yùn)行環(huán)境
開(kāi)發(fā)過(guò)程中一個(gè)常見(jiàn)的問(wèn)題是環(huán)境一致性問(wèn)題。由于開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境、生產(chǎn)環(huán)境不一致,導(dǎo)致有些 bug 并未在開(kāi)發(fā)過(guò)程中被發(fā)現(xiàn)。而 Docker 的鏡像提供了除內(nèi)核外完整的運(yùn)行時(shí)環(huán)境,確保了應(yīng)用運(yùn)行環(huán)境一致性,從而不會(huì)再出現(xiàn)「這段代碼在我機(jī)器上沒(méi)問(wèn)題啊」 這類問(wèn)題。
持續(xù)交付和部署
對(duì)開(kāi)發(fā)和運(yùn)維(DevOps)人員來(lái)說(shuō),最希望的就是一次創(chuàng)建或配置,可以在任意地方正常運(yùn)行。
使用 Docker 可以通過(guò)定制應(yīng)用鏡像來(lái)實(shí)現(xiàn)持續(xù)集成、持續(xù)交付、部署。開(kāi)發(fā)人員可以通過(guò) Dockerfile 來(lái)進(jìn)行鏡像構(gòu)建,并結(jié)合持續(xù)集成(Continuous Integration)系統(tǒng)進(jìn)行集成測(cè)試,而運(yùn)維人員則可以直接在生產(chǎn)環(huán)境中快速部署該鏡像,甚至結(jié)合持續(xù)部署(Continuous Delivery/Deployment)系統(tǒng)進(jìn)行自動(dòng)部署。
而且使用 Dockerfile 使鏡像構(gòu)建透明化,不僅僅開(kāi)發(fā)團(tuán)隊(duì)可以理解應(yīng)用運(yùn)行環(huán)境,也方便運(yùn)維團(tuán)隊(duì)理解應(yīng)用運(yùn)行所需條件,幫助更好的在生產(chǎn)環(huán)境中部署該鏡像。
更輕松的遷移
由于 Docker 確保了執(zhí)行環(huán)境的一致性,使得應(yīng)用的遷移更加容易。Docker 可以在很多平臺(tái)上運(yùn)行,無(wú)論是物理機(jī)、虛擬機(jī)、公有云、私有云,甚至是筆記本,其運(yùn)行結(jié)果是一致的。因此用戶可以很輕易的將在一個(gè)平臺(tái)上運(yùn)行的應(yīng)用,遷移到另一個(gè)平臺(tái)上,而不用擔(dān)心運(yùn)行環(huán)境的變化導(dǎo)致應(yīng)用無(wú)法正常運(yùn)行的情況。
更輕松的維護(hù)和擴(kuò)展
Docker 使用的分層存儲(chǔ)以及鏡像的技術(shù),使得應(yīng)用重復(fù)部分的復(fù)用更為容易,也使得應(yīng)用的維護(hù)更新更加簡(jiǎn)單,基于基礎(chǔ)鏡像進(jìn)一步擴(kuò)展鏡像也變得非常簡(jiǎn)單。此外,Docker 團(tuán)隊(duì)同各個(gè)開(kāi)源項(xiàng)目團(tuán)隊(duì)一起維護(hù)了一大批高質(zhì)量的 官方鏡像,既可以直接在生產(chǎn)環(huán)境使用,又可以作為基礎(chǔ)進(jìn)一步定制,大大的降低了應(yīng)用服務(wù)的鏡像制作成本。
容器與虛擬機(jī)的比較
下面的圖片比較了 Docker 和傳統(tǒng)虛擬化方式的不同之處,可見(jiàn)容器是在操作系統(tǒng)層面上實(shí)現(xiàn)虛擬化,直接復(fù)用本地主機(jī)的操作系統(tǒng),而傳統(tǒng)方式則是在硬件層面實(shí)現(xiàn)。
與傳統(tǒng)的虛擬機(jī)相比,Docker 優(yōu)勢(shì)體現(xiàn)為啟動(dòng)速度快、占用體積小。
至此 Docker 概念性相關(guān)內(nèi)容就介紹到這里,下文我們聊聊 Docker 架構(gòu)及其工作原理。
您的 點(diǎn)贊 和 轉(zhuǎn)發(fā) 是對(duì)我最大的支持。
關(guān)注 哈嘍沃德先生「文檔 + 視頻」每篇文章都配有專門視頻講解,學(xué)習(xí)更輕松噢 ~