Docker: 現(xiàn)在和未來
Docker – 迄今為止的故事
Docker是一種Linux容器工具集,它是為“構(gòu)建(build)、交付(ship)和運(yùn)行(運(yùn)行)”分布式應(yīng)用而設(shè)計(jì)的。作為DotCloud公司的開源項(xiàng)目,其首發(fā)版本的時(shí)間是2013年的3月份。該項(xiàng)目很快就受到歡迎,這也使得DotCloud公司將其品牌改為Docker(并最終將其原有的PaaS業(yè)務(wù)出售而專注在Docker上)。Docker 1.0在2014年6月發(fā)布,而且延續(xù)了之前每月發(fā)布一個(gè)版本的節(jié)奏。
其1.0版本標(biāo)志著Docker公司認(rèn)為Docker平臺(tái)已經(jīng)足夠成熟,并可以被應(yīng)用到產(chǎn)品中(公司及其合作伙伴們還提供了一些需要付費(fèi)的支持選項(xiàng))。每月的版本更新顯示出該項(xiàng)目仍在快速發(fā)展,比如增加新的特性,解決發(fā)現(xiàn)的問題。這個(gè)項(xiàng)目成功地將“交付”和“運(yùn)行”解耦,這樣源自任意Docker版本的鏡像都可以和其它任意不同版本一起工作(前向和后向均可兼容),這就為Docker應(yīng)用提供了穩(wěn)定的基礎(chǔ),以應(yīng)對(duì)快速的變化。
Docker發(fā)展成最受歡迎的開源項(xiàng)目可能會(huì)被人看作是一種炒作,但其實(shí)這個(gè)結(jié)果還是有堅(jiān)實(shí)的基礎(chǔ)來支撐的。Docker吸引了業(yè)界眾多知名大牌廠家的支持,其中包括亞馬遜(Amazon)、Canonical、CenturyLink、谷歌(Google)、IBM、 Microsoft、New Relic、Pivotal、Red Hat和VMware,這使得只要在有Linux的地方,Docker就幾乎隨處可用。除了這些大廠家,許多初創(chuàng)企業(yè)也圍繞著Docker來發(fā)展,或是將它們的發(fā)展方向和Docker更好地結(jié)合起來。所有這些合作伙伴(或大或?。?qū)動(dòng)著核心項(xiàng)目和周邊生態(tài)系統(tǒng)的快速發(fā)展。
Docker利用了一些Linux核心工具,比如cGruops、命名空間和SELinux來支撐容器之間的隔離。起初Docker只是LXC容器管理子系統(tǒng)的前端,但它在0.9版本中引入了libcontainer,這個(gè)原生的Go語言庫提供了用戶空間和內(nèi)核之間的接口。
Docker技術(shù)的簡要綜述
Docker容器是基于聯(lián)合文件系統(tǒng)(union file system)的,比如AUFS,利用它可以跨多個(gè)容器來共享一些組件,如操作系統(tǒng)鏡像和安裝的庫文件。這種分層的方式也被Dockerfile DevOps工具充分利用,這可以緩存那些已經(jīng)成功完成的操作。這就省掉了那些安裝操作系統(tǒng)和應(yīng)用程序依賴文件的時(shí)間,大幅度加速了測試周期。另外,在容器之間共享庫還能減少內(nèi)存的占用。
Docker容器是從鏡像開始的,鏡像可以是本地創(chuàng)建的、本地緩存的,或者是從注冊(cè)庫中下載的。Docker公司運(yùn)營著DockerHub公有注冊(cè)庫,上面有官方的數(shù)據(jù)倉庫,是為不同的操作系統(tǒng)、中間件和數(shù)據(jù)庫而創(chuàng)建的。組織和個(gè)人可以在Docker Hub上發(fā)布鏡像的公有庫,也可以將其注冊(cè)成私有庫。由于上傳的鏡像文件可以包含任何東西,所以Docker Hub提供了一種自動(dòng)構(gòu)建工具(之前被稱為“可信的構(gòu)建”),鏡像構(gòu)建于一個(gè)Dockerfile,它作為鏡像內(nèi)容的清單。
容器和虛擬機(jī)的對(duì)比
Docker容器要比虛擬機(jī)有效率的多,這是因?yàn)樗鼈兛梢怨蚕韮?nèi)核和相關(guān)的庫。同樣的原因,容器所占用的內(nèi)存也要比虛擬機(jī)少得多,雖然虛擬機(jī)利用了RAM的過度承諾技術(shù)(RAM overcommitment)。容器也減少了對(duì)存儲(chǔ)的占用,因?yàn)椴渴鸬娜萜鲿?huì)共享鏡像的底層。IBM的Boden Russel已經(jīng)做了一個(gè)基準(zhǔn)測試(benchmarking)來對(duì)比兩者的不同。
容器也表現(xiàn)出比虛擬機(jī)更低的系統(tǒng)負(fù)載,所以同樣的應(yīng)用,在容器中相比在虛擬機(jī)中,性能通常會(huì)相當(dāng)或者更好。IBM的研究者團(tuán)隊(duì)發(fā)布了一個(gè)虛擬機(jī)和Linux容器性能對(duì)比的報(bào)告可以參考。
容器只是在隔離特性上要比虛擬機(jī)差,虛擬機(jī)可以使用ring-1特權(quán)的硬件隔離技術(shù),如Intel的VT-d and VT-x。這種隔離技術(shù)可以防止虛擬機(jī)破出(breaking out)和彼此交互。容器沒有任何形式的硬件隔離,這使得它容易受到漏洞的利用。從Shocker(可對(duì)Docker進(jìn)行概念攻擊)的驗(yàn)證來看,Docker 1.0之前的版本都是很脆弱的。盡管利用Shocker,Docker在1.0版本中修復(fù)了一些特定的問題,但Docker的CTO Solomon Hykes仍然表示:“當(dāng)我們感覺可以輕松地宣稱Docker打開箱(out-of-the-box)可以安全容納非受信的uid0程序(譯者注: root和超級(jí)用戶權(quán)限)時(shí),我們一定會(huì)明言相告”。Hykes的話從另一方面承認(rèn)仍然存在一些其他的漏洞和相關(guān)的風(fēng)險(xiǎn),在容器變得可靠之前還有很多工作要做。
對(duì)于許多用戶案例,在容器和虛擬機(jī)二者之間選擇其一是種錯(cuò)誤的二分法。Docker可以在虛擬機(jī)中運(yùn)行地很好,這可以讓它應(yīng)用在已有的虛擬化框架中,如私有云和公有云。同樣也有可能在容器中運(yùn)行虛擬機(jī),這有點(diǎn)像谷歌在它的云平臺(tái)中使用容器的方式。只要IaaS得到廣泛應(yīng)用,并可按需提供虛擬機(jī)服務(wù),那么就有理由期待未來數(shù)年容器和虛擬機(jī)的應(yīng)用可以并存。還有一種可能,即將容器管理和虛擬化技術(shù)進(jìn)行融合以提供一種兩全其美的方法:所以硬件信任錨微虛擬化實(shí)現(xiàn)支撐libcontainer能夠與Docker的工具鏈和生態(tài)系統(tǒng)的前端進(jìn)行集成,而使用不同的提供了更好隔離性的后端。微虛擬技術(shù)(類似于Bromium的 vSentry和VMware的 Project Fargo)已經(jīng)應(yīng)用到桌面環(huán)境中為應(yīng)用提供基于硬件的隔離,所以相同的方法可以使用到libcontainer上,作為Linux核心容器機(jī)制的替代技術(shù)。
“容器化”的應(yīng)用
幾乎所有的Linux應(yīng)用都可以運(yùn)行在Docker容器里,并且對(duì)編程語言或架構(gòu)的選擇沒有任何的限制。實(shí)際上僅有的限制在于從操作系統(tǒng)的角度來看容器被允許做什么。即使如此,也可以通過在特權(quán)模式下運(yùn)行容器來降低限制,以大幅度地減少受到的控制(與此對(duì)應(yīng)的是裝載到容器里的應(yīng)用風(fēng)險(xiǎn)增加,并可能會(huì)導(dǎo)致對(duì)主機(jī)操作系統(tǒng)的損壞。)
容器從鏡像開始,反過來鏡像也可以從運(yùn)行的容器中得到。從本質(zhì)上說有兩種方法可以把應(yīng)用置入到容器中-手動(dòng)和Dockerfile。
手動(dòng)構(gòu)建
手動(dòng)構(gòu)建從啟動(dòng)一個(gè)基礎(chǔ)操作系統(tǒng)的容器開始,然后通過交互式終端,用所選Linux相關(guān)的包管理器安裝應(yīng)用程序及其依賴項(xiàng)(dependencies)。Zef Hemel在他的文章“使用Linux容器以支持便捷的應(yīng)用部署”中提供了這個(gè)過程的細(xì)致描述。一旦應(yīng)用完成安裝,新的容器就可以推送到注冊(cè)庫(比如Docker Hub)中或者被導(dǎo)出成一個(gè)tar文件。
Dockerfile
Dockerfile是對(duì)Docker容器創(chuàng)建過程進(jìn)行腳本化的系統(tǒng)。每個(gè)Dockerfile詳細(xì)說明了開始的基礎(chǔ)鏡像,以及隨后一系列在容器中運(yùn)行的命令和添加到容器中的文件。Dockerfile也可以說明容器對(duì)外的端口,啟動(dòng)時(shí)的工作目錄和缺省執(zhí)行的命令。用Dockerfile構(gòu)建的容器可以象手動(dòng)構(gòu)建那樣被推送到注冊(cè)庫中或者導(dǎo)出成tar文件。Dockerfile也可以應(yīng)用到Docker Hub的自動(dòng)構(gòu)建系統(tǒng)中,即在Docker公司的控制下,在系統(tǒng)中根據(jù)Dockerfile從頭構(gòu)建鏡像,并且這個(gè)鏡像的源對(duì)于使用它的任何人都是可見的。
一個(gè)進(jìn)程?
手動(dòng)構(gòu)建還是使用Dockerfile來構(gòu)建鏡像,考慮的關(guān)鍵在于容器剛啟動(dòng)時(shí)只能執(zhí)行一個(gè)單進(jìn)程。如果容器的服務(wù)目的比較單一,比如只運(yùn)行一個(gè)應(yīng)用服務(wù)器,那么運(yùn)行單個(gè)進(jìn)程就沒什么問題(一些爭論說容器本應(yīng)該只包括一個(gè)進(jìn)程)。對(duì)于那些希望在容器中運(yùn)行多個(gè)進(jìn)程的情況,管理進(jìn)程(supervisor process)需要先啟動(dòng),這樣它可以接著孵化出其他期望的進(jìn)程。此時(shí)容器中沒有初始的系統(tǒng),所以任何事都要依賴systemd,不修改新興系統(tǒng)或類似系統(tǒng)都無法工作。
容器和微服務(wù)
全面描述使用微服務(wù)架構(gòu)的哲理和益處已經(jīng)超出了本文的范圍(InfoQ eMag: Microservices中有全面的闡述)。容器仍然是一種方便的方法來綁定和部署微服務(wù)的實(shí)例。
雖然目前微服務(wù)大規(guī)模的部署實(shí)例還是在(大量)虛擬機(jī)上,但容器提供了一種小規(guī)模部署的機(jī)會(huì)。容器具有共享的內(nèi)存和針對(duì)操作系統(tǒng)的磁盤占用、通用代碼庫,這也意味著可以非常有效地一起部署多個(gè)版本的服務(wù)。
連接的容器
一些小的應(yīng)用適合放在單個(gè)容器中,但許多情況下應(yīng)用需要擴(kuò)展到多個(gè)容器。Docker成功催生了一系列新的應(yīng)用合成工具、編制工具以及平臺(tái)即服務(wù)實(shí)現(xiàn)。絕大多數(shù)努力的后面,是希望能簡化從一組相互連接的容器來創(chuàng)建應(yīng)用的過程。很多工具在擴(kuò)展、容錯(cuò)、性能管理和部署資產(chǎn)的版本控制方面也提供了幫助。
連接性
Docker的網(wǎng)絡(luò)能力相當(dāng)原始,容器中的服務(wù)對(duì)相同主機(jī)的其它容器是可見的,并且Docker可以映射端口到主機(jī)操作系統(tǒng),使得服務(wù)在網(wǎng)絡(luò)中也是可見的。Libchan是Docker官方贊助的連接方法,它提供了Go語言的網(wǎng)絡(luò)服務(wù)庫,類似于channels。在libchan找到自己應(yīng)用的道路之前,還是有空間留給第三方程序來提供一些補(bǔ)充性的網(wǎng)絡(luò)服務(wù)。例如,F(xiàn)locker采用了基于代理的方法,這使得服務(wù)(連同底層的存儲(chǔ))可以在主機(jī)間進(jìn)行遷移。
合成
Docker有個(gè)原生的機(jī)制來連接容器,它所依賴的元數(shù)據(jù)可以被傳送到相關(guān)的容器中,這些元數(shù)據(jù)被用做環(huán)境變量和主機(jī)入口。類似Fig和geard這樣的應(yīng)用合成工具,可以在單文件中表達(dá)這種依賴關(guān)系圖,這樣多個(gè)容器就可以互相配合成為一個(gè)系統(tǒng)。CenturyLink的Pannamax合成工具在底層采用了和Fig、geard相似的方法,但加入了基于Web的用戶接口,并且直接和GitHub進(jìn)行了集成,這樣就可以分享合成后的應(yīng)用了。
編制
編制系統(tǒng)包括Decking、New Relic公司的Centurion和谷歌公司的Kubernetes,它們的目標(biāo)都是幫助實(shí)現(xiàn)容器的部署和它的生命周期管理。也有很多基于Apache Mesos系統(tǒng)(特別是它為應(yīng)用長期運(yùn)行設(shè)計(jì)的Marathon框架)的商業(yè)化實(shí)現(xiàn)(比如Mesosphere),它們可以和Docker一起使用。通過提供在應(yīng)用需求和底層架構(gòu)間的抽象(例如,需求表達(dá)為CPU核數(shù)和內(nèi)存大小),編制工具提供了兩者之間的解耦,這種設(shè)計(jì)簡化了應(yīng)用開發(fā)和數(shù)據(jù)中心的運(yùn)維。還有各種各樣的編制系統(tǒng),這主要是因?yàn)橹霸S多內(nèi)部系統(tǒng)工具冒出來了,它們之前開發(fā)出來是用于管理容器大規(guī)模部署的。例如Kubernetes就是基于谷歌的Omega系統(tǒng),而Omega系統(tǒng)是用來管理整個(gè)谷歌云環(huán)境中的容器。
合成工具和編制工具功能上會(huì)有部分的重合,所以使用時(shí)它們彼此可以作為補(bǔ)充。例如Fig可以用來描述容器功能上如何交互,同時(shí)Kubernetes pods(譯者注:pods可以被看成一個(gè)容器組)可以用來提供相關(guān)的監(jiān)測和擴(kuò)展功能。
平臺(tái)即服務(wù)
有很多原生于Docker的PaaS實(shí)現(xiàn),例如Deis和Flynn,已經(jīng)體現(xiàn)出Linux容器在支持開發(fā)靈活性上的強(qiáng)大優(yōu)勢(shì)(而不是那些自以為是給定的一套語言和框架)。其它的云平臺(tái)如CloudFoundry、OpenShift和Apcera Continuum,已經(jīng)采用集成基于Docker相關(guān)功能到現(xiàn)有系統(tǒng)中的技術(shù)路線,這樣基于Docker鏡像(或者是創(chuàng)建它們的Dockerfiles)的應(yīng)用在部署和管理的同時(shí),仍然可以使用之前系統(tǒng)支持的語言和框架。
所有的云
由于Docker可以運(yùn)行在任何有合理數(shù)據(jù)內(nèi)核的Linux虛擬機(jī)上,所以它可以運(yùn)行在很多IaaS提供的云上。許多大的云提供商宣布了對(duì)Docker和它的生態(tài)系統(tǒng)的附加支持。
亞馬遜已經(jīng)引入Docker到它的彈性豆莖(Elastic Beanstalk)系統(tǒng)中(這是在IaaS之上的編制服務(wù))。谷歌使Docker成為可管理的虛擬機(jī)(managed VMs),它提供了在應(yīng)用程序引擎的PaaS和計(jì)算引擎的的IaaS之間的中間站。微軟和IBM也都宣布了基于Kubernetes的服務(wù),這樣在他們的云上就可以部署和管理多容器應(yīng)用了。
為了給當(dāng)前使用的廣泛多樣的后端提供一致性的接口,Docker團(tuán)隊(duì)引入了libswarm,它會(huì)被集成到多數(shù)的云和資源管理系統(tǒng)中。Libswarm一個(gè)明確的目標(biāo)是“通過切換服務(wù)來源的辦法來防止供應(yīng)商鎖定”。這通過呈現(xiàn)一組一致性的服務(wù)(以及相關(guān)的API)來完成,這些服務(wù)會(huì)附著到特定后端的實(shí)現(xiàn)上。比如Docker服務(wù)器服務(wù)會(huì)呈現(xiàn)Docker遠(yuǎn)程API到本地Docker命令行工具中,這樣眾多的服務(wù)提供者就可以管理相關(guān)的容器了。
基于Docker的新的服務(wù)類型仍在起步階段。雖然位于倫敦的果園實(shí)驗(yàn)室(Orchard labs)可以提供Docker容器的托管服務(wù),但Docker公司表示,在它收購果園實(shí)驗(yàn)室后相關(guān)服務(wù)不會(huì)被置于優(yōu)先位置。Docker公司還向cloudControl公司出售了其先前的DotCloud PaaS 業(yè)務(wù)。如OpenVZ之類基于舊的容器管理系統(tǒng)的服務(wù)已經(jīng)比較普通了,所以在一定程度上Docker需要向主機(jī)提供商們證明其價(jià)值。
Docker和它的發(fā)行版
Docker已經(jīng)成為主流Linux版本的標(biāo)準(zhǔn)特性,比如Ubuntu, Red Hat Enterprise Linux (RHEL) 和CentOS。遺憾的是這些Linux發(fā)行版與Docker項(xiàng)目在步調(diào)上并不一致,從而導(dǎo)致這些Linux發(fā)行版中Docker的版本比當(dāng)前能用的老得多。例如Ubuntu 14.04的Docker版本是0.9.1,并且在Ubuntu升級(jí)到14.04.1時(shí)Docker的版本也沒有變(當(dāng)時(shí)Docker項(xiàng)目版本是1.1.2)。在官方庫中還有一個(gè)命名空間沖突的問題,因?yàn)镈ocker也是KDE系統(tǒng)托盤的名字,所以在Ubuntu 14.04中Docker包和命令行工具起了另一個(gè)名稱“docker.io”。
在企業(yè)級(jí)Linux發(fā)行版中情況也沒有太大的不同,CentOS 7中Docker的版本是0.11.1,這是Docker公司宣布1.0版本產(chǎn)品準(zhǔn)備就緒之前的一個(gè)開發(fā)版。Linux發(fā)行版用戶如果要使用最新的版本以保證穩(wěn)定性、性能和安全,那么按照Docker安裝指導(dǎo)操作并使用Docker公司提供的庫,要比使用Linux發(fā)行版中的版本要好得多。
Docker的到來也催生了新的Linux發(fā)行版,比如CoreOS和Red Hat的Project Atomic,它們?cè)O(shè)計(jì)成能運(yùn)行容器的最小環(huán)境系統(tǒng)。這些發(fā)行版相比傳統(tǒng)Linux發(fā)行版本,有比較新的內(nèi)核和Docker版本,對(duì)內(nèi)存和硬盤的占用也比較小。新的發(fā)行版本中也有一些新的工具用來管理大容量的容器部署,比如fleet負(fù)責(zé)分布式系統(tǒng)啟動(dòng),而etcd負(fù)責(zé)元數(shù)據(jù)管理。這些Linux發(fā)行版針對(duì)自身的分布式更新采用了新的機(jī)制,這樣就可以使用最新版本的內(nèi)核和Docker了。這表示對(duì)Docker應(yīng)用的其中一種效果的認(rèn)可,那就是把注意力重心從發(fā)行版和包管理解決方案轉(zhuǎn)到Linux內(nèi)核(和使用內(nèi)核的Docker子系統(tǒng))上來。
盡管新發(fā)行版(譯者注:類似于CoreOS)可能是Docker最佳的運(yùn)行方式,但支持容器的傳統(tǒng)發(fā)行版和它們的包管理工具仍然非常重要。Docker Hub上提供了 Debian、Ubuntu和CentOS的正式鏡像,還有“半官方”Fedora的鏡像庫。RHEL沒有在Docker Hub上的鏡像,因?yàn)樗鼈兪侵苯佑蒖ed Hat發(fā)行的。這意味著Docker Hub上的自動(dòng)構(gòu)建機(jī)制只對(duì)那些純開源的Linux發(fā)行版本可用(并愿意信任那些起源于Docker公司團(tuán)隊(duì)策劃的基礎(chǔ)鏡像)。
Docker Hub同時(shí)集成了源控制系統(tǒng),如GitHub和Bitbucker,用來自動(dòng)構(gòu)建包管理器。包管理器可以在鏡像構(gòu)建過程中生成構(gòu)建規(guī)格(在Dockerfile中)和最終構(gòu)建鏡像之間的復(fù)雜關(guān)系。構(gòu)建過程的結(jié)果具有不確定性,這不是Docker的特定問題,而和包管理器如何工作相關(guān)。今天構(gòu)建的是這個(gè)版本,在另一個(gè)時(shí)間構(gòu)建可能會(huì)得到一個(gè)新的版本,這也就是包管理器需要更新功能的原因。容器抽象(即較少關(guān)注容器中的內(nèi)容)與容器擴(kuò)展(因?yàn)檩p量級(jí)資源利用率)可能會(huì)使這種不確定性成為Docker相關(guān)的痛點(diǎn)。
Docker的未來
Docker公司已經(jīng)建立了清晰的道路,即發(fā)展核心能力(libcontainer)、跨業(yè)務(wù)管理(libswarm)和容器間消息(libchan)。與此同時(shí),通過收購果園實(shí)驗(yàn)室(Orchard labs),Docker公司表達(dá)了利用自身生態(tài)系統(tǒng)的意愿。但是,這不僅僅關(guān)注Docker公司,這個(gè)項(xiàng)目的貢獻(xiàn)者還來自于一些大牌公司,如谷歌、IBM和Red Hat。在仁慈的獨(dú)裁者、首席技術(shù)官Solomon Hykes的掌舵下,Docker公司和Docker項(xiàng)目的技術(shù)領(lǐng)先有著明確的聯(lián)系。在項(xiàng)目初始的18個(gè)月里,它已經(jīng)顯示出通過自己的輸出來快速前進(jìn)的能力,并且沒有減弱的跡象。
許多投資者正著眼于十年前VMware公司ESX/ vSphere平臺(tái)的功能矩陣,試圖找出已經(jīng)由虛擬機(jī)普及而驅(qū)動(dòng)的企業(yè)預(yù)期和現(xiàn)有Docker生態(tài)系統(tǒng)之間的差距(和機(jī)會(huì))。在網(wǎng)絡(luò)存儲(chǔ)和細(xì)粒度的版本管理(用于容器中的內(nèi)容)領(lǐng)域,現(xiàn)有Docker生態(tài)系統(tǒng)做得并不好,這就為初創(chuàng)企業(yè)和在職人員提供了機(jī)會(huì)。
隨著時(shí)間的推移,虛擬機(jī)和容器(Docker中的“運(yùn)行”部分)之間的區(qū)別很可能變得不再那么重要,這將使注意力轉(zhuǎn)到“構(gòu)建(build)”和“交付(ship)”方面。這些變化將使 “Docker會(huì)發(fā)生什么?”的問題,相比“Docker會(huì)帶給IT業(yè)什么?”的問題,變得更不重要。
關(guān)于作者
Chris Swan 是云網(wǎng)絡(luò)軟件供應(yīng)商CohesiveFT的首席技術(shù)官。作為銀行業(yè)的技術(shù)專家和技術(shù)領(lǐng)域的銀行專家,他曾經(jīng)有十幾年的時(shí)間在從事金融服務(wù)業(yè)。他大部分時(shí)間是在大型瑞士銀行中與應(yīng)用服務(wù)器、計(jì)算網(wǎng)格、安全、移動(dòng)和云這些基礎(chǔ)設(shè)施打交道??死锼惯€喜歡參與互聯(lián)網(wǎng)上的修補(bǔ)工作,包括一些Raspberry Pi項(xiàng)目。
原文出自:http://blog.csdn.net/miller_lover/article/details/41073547