2022-10-06 分類: 網(wǎng)站建設(shè)
最近對(duì)Docker和Kubernetes進(jìn)行了一番學(xué)習(xí),前兩天做了一次技術(shù)分享,回去聽了一遍自己演講的錄音,發(fā)現(xiàn)單單PPT做好還是遠(yuǎn)遠(yuǎn)不夠的,沒有提前準(zhǔn)備好邏輯嚴(yán)謹(jǐn)?shù)闹v稿,在講的時(shí)候出現(xiàn)了卡殼、漏掉技術(shù)點(diǎn)、邏輯矛盾的問題。
為了解決這個(gè)問題,我打算以后在做技術(shù)分享前,都按著PPT的內(nèi)容先寫成博客,理順表達(dá)邏輯。另外,我覺得每次技術(shù)分享使用的PPT都應(yīng)該盡可能的做好,因?yàn)槟悴恢牢磥頃?huì)不會(huì)還要拿來再講幾遍。本文以PPT+講稿的方式編寫,權(quán)當(dāng)對(duì)自己這次技術(shù)分享做個(gè)記錄,歡迎大家拍磚。
1. Docker出現(xiàn)的背景
在平常的研發(fā)和項(xiàng)目場景中,以下情況普遍存在:
個(gè)人開發(fā)環(huán)境
為了做大數(shù)據(jù)相關(guān)項(xiàng)目,需要安裝一套CDH集群,常見的做法是在自己電腦里搭建3臺(tái)與CDH版本對(duì)應(yīng)的虛擬機(jī),把CDH集群裝起來后,考慮到以后很有可能還要使用一個(gè)干凈的CDH集群,為了避免以后重復(fù)安裝環(huán)境,通常會(huì)對(duì)整套CDH集群做一個(gè)備份,這樣電腦里就有6個(gè)虛擬機(jī)鏡像了。
另外,后面在學(xué)習(xí)其他技術(shù)時(shí),比如學(xué)習(xí)Ambari大數(shù)據(jù)集群,那么為了不破壞已有的虛擬機(jī)環(huán)境,又要重新搭建3臺(tái)虛擬機(jī),本機(jī)磁盤很快被一大堆的虛擬機(jī)鏡像占滿。
公司內(nèi)部開發(fā)環(huán)境
公司里往往會(huì)以小團(tuán)隊(duì)的方式來做項(xiàng)目,一般由運(yùn)維部門從他們管理的服務(wù)器資源中分配出虛擬機(jī)供團(tuán)隊(duì)內(nèi)部開發(fā)測試使用。比如做一個(gè)與機(jī)器學(xué)習(xí)相關(guān)的項(xiàng)目:
小明在運(yùn)維部門分配的虛擬機(jī)上搭建了一套Ambari集群,拿來跑大數(shù)據(jù)相關(guān)業(yè)務(wù)
小剛用python3寫了一個(gè)機(jī)器學(xué)習(xí)算法,放到虛擬機(jī)上運(yùn)行發(fā)現(xiàn)虛擬機(jī)里是python2,算法不兼容,于是把虛擬機(jī)里的python版本升級(jí)了,算法跑通了,但Ambari用到python的部分功能可能就報(bào)錯(cuò)了
小李開發(fā)了應(yīng)用,放到虛擬機(jī)上啟動(dòng)tomcat,發(fā)現(xiàn)虛擬機(jī)里的是OpenJDK,導(dǎo)致tomcat起不來,于是又安裝了一個(gè)JDK,這時(shí)候可能Ambari里的Java代碼可能就報(bào)錯(cuò)了
小趙想利用服務(wù)器資源做性能測試,發(fā)現(xiàn)虛擬機(jī)嚴(yán)重削減了性能,最終還是要直接找物理機(jī)來跑測試,破壞了物理機(jī)原來的環(huán)境
做完項(xiàng)目后,這些虛擬機(jī)上安裝的東西往往變得沒用了,下個(gè)項(xiàng)目組來還是得新申請?zhí)摂M機(jī)重新部署軟件
開發(fā)/測試/現(xiàn)場環(huán)境
研發(fā)人員在開發(fā)環(huán)境里寫好了代碼做好測試后,提交給測試部門,測試人員在測試環(huán)境跑起來發(fā)現(xiàn)有BUG,研發(fā)人員說在開發(fā)環(huán)境沒這個(gè)BUG,和測試人員多次扯皮解決BUG后發(fā)布版本,發(fā)到現(xiàn)場在生產(chǎn)環(huán)境部署后,又發(fā)現(xiàn)有BUG,這下輪到工程人員和測試人員扯皮。有時(shí)候?yàn)榱思嫒萏厥獾默F(xiàn)場環(huán)境,還需要對(duì)代碼進(jìn)行定制化修改,拉出分支,這樣導(dǎo)致了每次到現(xiàn)場升級(jí)都是一場噩夢
升級(jí)或遷移項(xiàng)目
在每次發(fā)版本要升級(jí)到現(xiàn)場時(shí),如果現(xiàn)場起了多個(gè)tomcat應(yīng)用,那么需要對(duì)每個(gè)tomcat都先停掉,替換war包,然后再起起來,輪流著做,不僅繁瑣而且很容易出錯(cuò),如果遇到升級(jí)后出現(xiàn)嚴(yán)重BUG,還要手工做回退。
另外,如果項(xiàng)目想上云,那么在云上部署后要重新進(jìn)行一輪測試,如果后面考慮還云廠商,可能相同的測試還要再進(jìn)行一次(比如更換了數(shù)據(jù)存儲(chǔ)組件),費(fèi)時(shí)費(fèi)力。
總結(jié)以上列舉的所有場景,他們存在的一個(gè)共同的問題是:沒有一種既能夠屏蔽操作系統(tǒng)差異,又能夠以不降低性能的方式來運(yùn)行應(yīng)用的技術(shù),來解決環(huán)境依賴的問題。Docker應(yīng)運(yùn)而生。
2. Docker是什么
Docker是一種應(yīng)用容器引擎。
首先說一下何為容器,Linux系統(tǒng)提供了Namespace和CGroup技術(shù)實(shí)現(xiàn)環(huán)境隔離和資源控制,其中Namespace是Linux提供的一種內(nèi)核級(jí)別環(huán)境隔離的方法,能使一個(gè)進(jìn)程和該進(jìn)程創(chuàng)建的子進(jìn)程的運(yùn)行空間都與Linux的超級(jí)父進(jìn)程相隔離。
注意Namespace只能實(shí)現(xiàn)運(yùn)行空間的隔離,物理資源還是所有進(jìn)程共用的,為了實(shí)現(xiàn)資源隔離,Linux系統(tǒng)提供了CGroup技術(shù)來控制一個(gè)進(jìn)程組群可使用的資源(如CPU、內(nèi)存、磁盤IO等),把這兩種技術(shù)結(jié)合起來,就能構(gòu)造一個(gè)用戶空間獨(dú)立且限定了資源的對(duì)象,這樣的對(duì)象稱為容器。
Linux Container是Linux系統(tǒng)提供的容器化技術(shù),簡稱LXC,它結(jié)合Namespace和CGroup技術(shù)為用戶提供了更易用的接口來實(shí)現(xiàn)容器化。LXC僅為一種輕量級(jí)的容器化技術(shù),它僅能對(duì)部分資源進(jìn)行限制,無法做到諸如網(wǎng)絡(luò)限制、磁盤空間占用限制等。dotCloud公司結(jié)合LXC和以下列出的技術(shù)實(shí)現(xiàn)了Docker容器引擎,相比于LXC,Docker具備更加全面的資源控制能力,是一種應(yīng)用級(jí)別的容器引擎。
Chroot:該技術(shù)能在container里構(gòu)造完整的Linux文件系統(tǒng);
Veth:該技術(shù)能夠在主機(jī)上虛擬出一張網(wǎng)卡與container里的eth0網(wǎng)卡進(jìn)行橋接,實(shí)現(xiàn)容器與主機(jī)、容器之間的網(wǎng)絡(luò)通信;
UnionFS:聯(lián)合文件系統(tǒng),Docker利用該技術(shù)“Copy on Write”的特點(diǎn)實(shí)現(xiàn)容器的快速啟動(dòng)和極少的資源占用,后面會(huì)專門介紹該文件系統(tǒng);
Iptables/netfilter:通過這兩個(gè)技術(shù)實(shí)現(xiàn)控制container網(wǎng)絡(luò)訪問策略;
TC:該技術(shù)主要用來做流量隔離,限制帶寬;
Quota:該技術(shù)用來限制磁盤讀寫空間的大小;
Setrlimit:該技術(shù)用來限制container中打開的進(jìn)程數(shù),限制打開的文件個(gè)數(shù)等
也正是因?yàn)镈ocker依賴Linux內(nèi)核的這些技術(shù),至少使用3.8或更高版本的內(nèi)核才能運(yùn)行Docker容器,官方建議使用3.10以上的內(nèi)核版本。
3. 與傳統(tǒng)虛擬化技術(shù)的區(qū)別
傳統(tǒng)的虛擬化技術(shù)在虛擬機(jī)(VM)和硬件之間加了一個(gè)軟件層Hypervisor,或者叫做虛擬機(jī)管理程序。Hypervisor的運(yùn)行方式分為兩類:
直接運(yùn)行在物理硬件之上。如基于內(nèi)核的KVM虛擬機(jī),這種虛擬化需要CPU支持虛擬化技術(shù);
運(yùn)行在另一個(gè)操作系統(tǒng)。如VMWare和VitrualBox等虛擬機(jī)。
因?yàn)檫\(yùn)行在虛擬機(jī)上的操作系統(tǒng)是通過Hypervisor來最終分享硬件,所以虛擬機(jī)Guest OS發(fā)出的指令都需要被Hypervisor捕獲,然后翻譯為物理硬件或宿主機(jī)操作系統(tǒng)能夠識(shí)別的指令。
VMWare和VirtualBox等虛擬機(jī)在性能方面遠(yuǎn)不如裸機(jī),但基于硬件虛擬機(jī)的KVM約能發(fā)揮裸機(jī)80%的性能。這種虛擬化的優(yōu)點(diǎn)是不同虛擬機(jī)之間實(shí)現(xiàn)了完全隔離,安全性很高,并且能夠在一臺(tái)物理機(jī)上運(yùn)行多種內(nèi)核的操作系統(tǒng)(如Linux和Window),但每個(gè)虛擬機(jī)都很笨重,占用資源多而且啟動(dòng)很慢。
Docker引擎運(yùn)行在操作系統(tǒng)上,是基于內(nèi)核的LXC、Chroot等技術(shù)實(shí)現(xiàn)容器的環(huán)境隔離和資源控制,在容器啟動(dòng)后,容器里的進(jìn)程直接與內(nèi)核交互,無需經(jīng)過Docker引擎中轉(zhuǎn),因此幾乎沒有性能損耗,能發(fā)揮出裸機(jī)的全部性能。
但由于Docker是基于Linux內(nèi)核技術(shù)實(shí)現(xiàn)容器化的,因此使得容器內(nèi)運(yùn)行的應(yīng)用只能運(yùn)行在Linux內(nèi)核的操作系統(tǒng)上。目前在Window上安裝的docker引擎其實(shí)是利用了Window自帶的Hyper-V虛擬化工具自動(dòng)創(chuàng)建了一個(gè)Linux系統(tǒng),容器內(nèi)的操作實(shí)際上是間接使用這個(gè)虛擬系統(tǒng)實(shí)現(xiàn)的。
4. Docker基本概念
Docker主要有如下幾個(gè)概念:
引擎:創(chuàng)建和管理容器的工具,通過讀取鏡像來生成容器,并負(fù)責(zé)從倉庫拉取鏡像或提交鏡像到倉庫中;
鏡像:類似于虛擬機(jī)鏡像,一般由一個(gè)基本操作系統(tǒng)環(huán)境和多個(gè)應(yīng)用程序打包而成,是創(chuàng)建容器的模板;
容器:可看作一個(gè)簡易版的Linxu系統(tǒng)環(huán)境(包括root用戶權(quán)限、進(jìn)程空間、用戶空間和網(wǎng)絡(luò)空間等)以及運(yùn)行在其中的應(yīng)用程序打包而成的盒子;
倉庫:集中存放鏡像文件的場所,分為公共倉庫和私有倉庫,目前大的公共倉庫是官方提供的Docker Hub,此外國內(nèi)的阿里云、騰訊云等也提供了公共倉庫;
宿主機(jī):運(yùn)行引擎的操作系統(tǒng)所在服務(wù)器。
5. Docker與虛擬機(jī)、Git、JVM的類比
為了讓大家對(duì)Docker有更直觀的認(rèn)識(shí),下面分別進(jìn)行三組類比:
上圖中Docker的鏡像倉庫類似于傳統(tǒng)虛擬機(jī)的鏡像倉庫或存放鏡像的本地文件系統(tǒng),Docker引擎啟動(dòng)容器來運(yùn)行Spark集群(容器內(nèi)包含基礎(chǔ)的Linux操作系統(tǒng)環(huán)境),類比于虛擬機(jī)軟件啟動(dòng)多個(gè)虛擬機(jī),在虛擬機(jī)內(nèi)分別運(yùn)行Spark進(jìn)程,兩者區(qū)別在于Docker容器內(nèi)的應(yīng)用在使用物理資源時(shí),直接與內(nèi)核打交道,無需經(jīng)過Docker引擎。
Docker的倉庫思想與Git是相同的。
Docker的口號(hào)是“Build,Ship,and Run Any App,Anywhere”,也就是可以基于Docker構(gòu)建、裝載和運(yùn)行應(yīng)用程序,一次構(gòu)建到處運(yùn)行。Java的口號(hào)是“Write Once,Run Anywhere”,即一次編寫到處運(yùn)行。
Java是基于JVM適配操作系統(tǒng)的特點(diǎn)來屏蔽系統(tǒng)的差異,Docker則是利用內(nèi)核版本兼容性的特點(diǎn)來實(shí)現(xiàn)一次構(gòu)建導(dǎo)出運(yùn)行,只要Linux系統(tǒng)的內(nèi)核是3.8或更高的版本,就都能把容器跑起來。
當(dāng)然,正如Java中如果應(yīng)用代碼使用了JDK10的新特性,基于JDK8就無法運(yùn)行一樣,如果容器內(nèi)的應(yīng)用使用了4.18版本的內(nèi)核特性,那么在CentOS7(內(nèi)核版本為3.10)啟動(dòng)容器時(shí),雖然容器能夠啟動(dòng),但里面應(yīng)用的功能是無法正常運(yùn)行的,除非把宿主機(jī)的操作系統(tǒng)內(nèi)核升級(jí)到4.18版本。
6. Docker鏡像文件系統(tǒng)
Docker鏡像采用分層存儲(chǔ)格式,每個(gè)鏡像可依賴其他鏡像進(jìn)行構(gòu)建,每一層的鏡像可被多個(gè)鏡像引用,上圖的鏡像依賴關(guān)系,K8S鏡像其實(shí)是CentOS+GCC+GO+K8S這四個(gè)軟件結(jié)合的鏡像。
這種分層結(jié)構(gòu)能充分共享鏡像層,能大大減少鏡像倉庫占用的空間,而對(duì)用戶而言,他們所看到的容器,其實(shí)是Docker利用UnionFS(聯(lián)合文件系統(tǒng))把相關(guān)鏡像層的目錄“聯(lián)合”到同一個(gè)掛載點(diǎn)呈現(xiàn)出來的一個(gè)整體,這里需要簡單介紹一個(gè)UnionFS是什么:
UnionFS可以把多個(gè)物理位置獨(dú)立的目錄(也叫分支)內(nèi)容聯(lián)合掛載到同一個(gè)目錄下,UnionFS允許控制這些目錄的讀寫權(quán)限,此外對(duì)于只讀的文件和目錄,它具有“Copy on Write(寫實(shí)復(fù)制)”的特點(diǎn),即如果對(duì)一個(gè)只讀的文件進(jìn)行修改,在修改前會(huì)先把文件復(fù)制一份到可寫層(可能是磁盤里的一個(gè)目錄),所有的修改操作其實(shí)都是對(duì)這個(gè)文件副本進(jìn)行修改,原來的只讀文件并不會(huì)變化。
其中一個(gè)使用UnionFS的例子是:Knoppix,一個(gè)用于Linux演示、光盤教學(xué)和商業(yè)產(chǎn)品演示的Linux發(fā)行版,它就是把一個(gè)CD/DVD和一個(gè)存在在可讀寫設(shè)備(例如U盤)聯(lián)合掛載,這樣在演示過程中任何對(duì)CD/DVD上文件的改動(dòng)都會(huì)在被應(yīng)用在U盤上,不改變原來的CD/DVD上的內(nèi)容。
UnionFS有很多種,其中Docker中常用的是AUFS,這是UnionFS的升級(jí)版,除此之外還有DeviceMapper、Overlay2、ZFS和 VFS等。Docker鏡像的每一層默認(rèn)存放在/var/lib/docker/aufs/diff目錄中,當(dāng)用戶啟動(dòng)一個(gè)容器時(shí),Docker引擎首先在/var/lib/docker/aufs/diff中新建一個(gè)可讀寫層目錄,然后使用UnionFS把該可讀寫層目錄和指定鏡像的各層目錄聯(lián)合掛載到/var/lib/docker/aufs/mnt里的一個(gè)目錄中(其中指定鏡像的各層目錄都以只讀方式掛載),通過LXC等技術(shù)進(jìn)行環(huán)境隔離和資源控制,使容器里的應(yīng)用僅依賴mnt目錄中對(duì)應(yīng)的掛載目錄和文件運(yùn)行起來。
利用UnionFS寫實(shí)復(fù)制的特點(diǎn),在啟動(dòng)一個(gè)容器時(shí), Docker引擎實(shí)際上只是增加了一個(gè)可寫層和構(gòu)造了一個(gè)Linux容器,這兩者都幾乎不消耗系統(tǒng)資源,因此Docker容器能夠做到秒級(jí)啟動(dòng),一臺(tái)服務(wù)器上能夠啟動(dòng)上千個(gè)Docker容器,而傳統(tǒng)虛擬機(jī)在一臺(tái)服務(wù)器上啟動(dòng)幾十個(gè)就已經(jīng)非常吃力了,而且虛擬機(jī)啟動(dòng)很慢,這是Docker相比于傳統(tǒng)虛擬機(jī)的兩個(gè)巨大的優(yōu)勢。
當(dāng)應(yīng)用只是直接調(diào)用了內(nèi)核功能來運(yùn)作的情況下,應(yīng)用本身就能直接作為最底層的層來構(gòu)建鏡像,但因?yàn)槿萜鞅旧頃?huì)隔絕環(huán)境,因此容器內(nèi)部是無法訪問宿主機(jī)里文件的(除非指定了某些目錄或文件映射到容器內(nèi)),這種情況下應(yīng)用代碼就只能使用內(nèi)核的功能。
但是Linux內(nèi)核僅提供了進(jìn)程管理、內(nèi)存管理、文件系統(tǒng)管理等一些基礎(chǔ)且底層的管理功能,在實(shí)際的場景中,幾乎所有軟件都是基于操作系統(tǒng)來開發(fā)的,因此往往都需要依賴操作系統(tǒng)的軟件和運(yùn)行庫等,如果這些應(yīng)用的下一層直接是內(nèi)核,那么應(yīng)用將無法運(yùn)行。所以實(shí)際上應(yīng)用鏡像往往底層都是基于一個(gè)操作系統(tǒng)鏡像來補(bǔ)足運(yùn)行依賴的。
Docker中的操作系統(tǒng)鏡像,與平常安裝系統(tǒng)時(shí)用的ISO鏡像不同。ISO鏡像里包含了操作系統(tǒng)內(nèi)核及該發(fā)行版系統(tǒng)包含的所有目錄和軟件,而Docker中的操作系統(tǒng)鏡像,不包含系統(tǒng)內(nèi)核,僅包含系統(tǒng)必備的一些目錄(如/etc /proc等)和常用的軟件和運(yùn)行庫等,可把操作系統(tǒng)鏡像看作內(nèi)核之上的一個(gè)應(yīng)用,一個(gè)封裝了內(nèi)核功能,并為用戶編寫的應(yīng)用提供運(yùn)行環(huán)境的工具。
應(yīng)用基于這樣的鏡像構(gòu)建,就能夠利用上相應(yīng)操作系統(tǒng)的各種軟件的功能和運(yùn)行庫,此外,由于應(yīng)用是基于操作系統(tǒng)鏡像來構(gòu)建的,就算換到另外的服務(wù)器,只要操作系統(tǒng)鏡像中被應(yīng)用使用到的功能能適配宿主機(jī)的內(nèi)核,應(yīng)用就能正常運(yùn)行,這就是一次構(gòu)建到處運(yùn)行的原因。
下圖形象的表現(xiàn)出了鏡像和容器的關(guān)系:
上圖中Apache應(yīng)用基于emacs鏡像構(gòu)建,emacs基于Debian系統(tǒng)鏡像構(gòu)建,在啟動(dòng)為容器時(shí),在Apache鏡像層之上構(gòu)造了一個(gè)可寫層,對(duì)容器本身的修改操作都在可寫層中進(jìn)行。Debian是該鏡像的基礎(chǔ)鏡像(Base Image),它提供了內(nèi)核Kernel的更高級(jí)的封裝。同時(shí)其他的鏡像也是基于同一個(gè)內(nèi)核來構(gòu)建的(以下的BusyBox是一個(gè)精簡版的操作系統(tǒng)鏡像):
這時(shí)候就會(huì)有一個(gè)問題,應(yīng)用基于操作系統(tǒng)鏡像來構(gòu)建,那如果操作系統(tǒng)鏡像本身就很占空間,豈不是鏡像的分發(fā)不方便,而且鏡像倉庫占用的空間也會(huì)很大。有人已經(jīng)考慮到這一點(diǎn),針對(duì)不同的場景分別構(gòu)造了不同的操作系統(tǒng)鏡像,下面介紹幾種最常用的系統(tǒng)鏡像。
7. Docker基礎(chǔ)操作系統(tǒng)
以上系統(tǒng)鏡像分別適用于不同的場景:
BusyBox:一個(gè)極簡版的Linux系統(tǒng),集成了100多種常用Linux命令,大小不到2MB,被稱為“Linux系統(tǒng)的瑞士軍刀”,適用于簡單測試場景;
Alpine:一個(gè)面向安全的輕型Linux發(fā)行版系統(tǒng),比BusyBox功能更完善,大小不到5MB,是官網(wǎng)推薦的基礎(chǔ)鏡像,由于其包含了足夠的基礎(chǔ)功能和體積較小,在生產(chǎn)環(huán)境中最常用;
Debian/Ubuntu:Debian系列操作系統(tǒng),功能完善,大小約170MB,適合研發(fā)環(huán)境;
CentOS/Fedora:都是基于Redhat的Linux發(fā)行版,企業(yè)級(jí)服務(wù)器常用操作系統(tǒng),穩(wěn)定性高,大小約200MB,適合生產(chǎn)環(huán)境使用。
8. Docker持久化存儲(chǔ)
根據(jù)前面介紹的容器UnionFS寫實(shí)復(fù)制的特點(diǎn),可知在容器里增加、刪除或修改文件,其實(shí)都是對(duì)可寫層里的文件副本進(jìn)行了操作。在容器關(guān)閉后,該可寫層也會(huì)被刪除,對(duì)容器的所有修改都會(huì)失效,因此需要解決容器內(nèi)文件持久化的問題。Docker提供了兩種方案來實(shí)現(xiàn):
把宿主機(jī)文件系統(tǒng)里的目錄映射到容器內(nèi)的目錄,如下圖所示。如此一來,容器內(nèi)在該目錄里創(chuàng)建的所有文件,都存儲(chǔ)到宿主機(jī)的對(duì)應(yīng)目錄中,在關(guān)閉容器后,宿主機(jī)的目錄依然存在,再次啟動(dòng)容器時(shí)還能讀取到之前創(chuàng)建的文件,因此實(shí)現(xiàn)了容器的文件持久化。
當(dāng)然同時(shí)要明白,如果是對(duì)鏡像自帶文件進(jìn)行了修改,由于鏡像是只讀的,該修改操作無法在關(guān)閉容器時(shí)保存下來,除非在修改了文件后構(gòu)建一個(gè)新的鏡像。
把多臺(tái)宿主機(jī)的磁盤目錄通過網(wǎng)絡(luò)聯(lián)合為共享存儲(chǔ),然后把共享存儲(chǔ)中的特定目錄映射給特定的容器,如下圖所示。這樣容器在重啟時(shí),還是能讀取到關(guān)閉前創(chuàng)建的文件。生產(chǎn)環(huán)境中常用NFS作為共享存儲(chǔ)方案。
9. Docker鏡像制作方法
鏡像制作方法有兩種:
(1)通過正在運(yùn)行的容器生成新鏡像
當(dāng)一個(gè)容器在運(yùn)行時(shí),在里面所有的修改都會(huì)體現(xiàn)在容器的可寫層,Docker提供了commit命令,可以把正在運(yùn)行的容器,疊加上可寫層的修改內(nèi)容,生成一個(gè)新鏡像。
如上圖所示,在容器里新安裝Spark組件的,如果關(guān)閉容器,Spark組件會(huì)隨著可寫層的消失而消失,如果在關(guān)閉容器之前使用commit命令生成新鏡像,那么使用新鏡像啟動(dòng)為容器時(shí),容器里就會(huì)包含Spark組件。
這種方式比較簡單,但無法直觀的設(shè)置環(huán)境變量、監(jiān)聽端口等內(nèi)容,適合在簡單使用的場景運(yùn)用。
(2)通過Dockerfile文件來生成新鏡像
Dockerfile是一個(gè)定義了鏡像創(chuàng)建步驟的文件,Docker引擎通過build命令讀取Dockerfile,按定義的步驟來一步步構(gòu)造鏡像。在研發(fā)和實(shí)施環(huán)境中,通過Dockerfile 創(chuàng)建容器是主流做法。
下面是一個(gè)Dockerfile的例子:
Docker引擎可以根據(jù)以上Dockerfile定義的步驟,構(gòu)造出一個(gè)帶有ssh服務(wù)的Ubuntu鏡像。
10. Docker的使用場景
Docker作為一種輕量級(jí)的虛擬化方案,應(yīng)用場景十分豐富,下面收集了一些常見的場景:
作為輕量級(jí)虛擬機(jī)使用
可以使用Ubuntu等系統(tǒng)鏡像創(chuàng)建容器,當(dāng)作虛擬機(jī)來使用,相比于傳統(tǒng)虛擬機(jī),啟動(dòng)速度更快,資源占用更少,單機(jī)可以啟動(dòng)大量的操作系統(tǒng)容器,方便進(jìn)行各種測試;
作為云主機(jī)使用
結(jié)合Kubernetes這樣的容器管理系統(tǒng),可以在大量服務(wù)器上動(dòng)態(tài)分配和管理容器,在公司內(nèi)部,甚至可以取代VMWare這樣的虛擬機(jī)管理平臺(tái),使用Docker容器作為云主機(jī)使用;
應(yīng)用服務(wù)打包
在Web應(yīng)用服務(wù)開發(fā)場景,可以把Java運(yùn)行環(huán)境、Tomcat服務(wù)器打包為一個(gè)基礎(chǔ)鏡像,在修改了代碼包后加入到基礎(chǔ)鏡像來構(gòu)建一個(gè)新的鏡像,能很方便的升級(jí)服務(wù)和控制版本;
容器云平臺(tái)CaaS
Docker的出現(xiàn),使得很多云平臺(tái)供應(yīng)商開始提供容器云的服務(wù),簡稱容器即服務(wù)CaaS,以下對(duì)比一下IaaS、PaaS和SaaS:
IaaS(基礎(chǔ)設(shè)施即服務(wù)):提供虛擬機(jī)或者其他基礎(chǔ)資源作為服務(wù)提供給用戶。用戶可以從供應(yīng)商那里獲得虛擬機(jī)或者存儲(chǔ)等資源來裝載相關(guān)的應(yīng)用,同時(shí)這些基礎(chǔ)設(shè)施的繁瑣的管理工作將由IaaS供應(yīng)商來處理。其主要的用戶是企業(yè)的系統(tǒng)管理員和運(yùn)維人員;
PaaS(平臺(tái)即服務(wù)):把開發(fā)平臺(tái)作為服務(wù)提供給用戶。用戶可以在一個(gè)包括SDK,文檔和測試環(huán)境等在內(nèi)的開發(fā)平臺(tái)上非常方便地編寫應(yīng)用,而且不論是在部署,或者在運(yùn)行的時(shí)候,用戶都無需為服務(wù)器、操作系統(tǒng)、網(wǎng)絡(luò)和存儲(chǔ)等資源的管理操心,這些繁瑣的工作都由PaaS供應(yīng)商負(fù)責(zé)處理。其主要的用戶是企業(yè)開發(fā)人員。
SaaS(軟件即服務(wù)):將應(yīng)用作為服務(wù)提供給客戶。用戶只要接上網(wǎng)絡(luò),并通過瀏覽器,就能直接使用在云端上運(yùn)行的應(yīng)用,而不需要顧慮類似安裝等瑣事,并且免去初期高昂的軟硬件投入。SaaS主要面對(duì)的是普通的用戶。
CaaS(容器即服務(wù)):完成IaaS和PaaS兩個(gè)層級(jí)的功能。相對(duì)于傳統(tǒng)的IaaS和PaaS服務(wù),CaaS對(duì)底層的支持比PaaS更靈活,而對(duì)上層應(yīng)用的操控又比IaaS更容易。同時(shí)因?yàn)镈ocker是比VM更細(xì)粒度的虛擬化服務(wù),所以能夠?qū)τ?jì)算資源做到更高效的利用。CaaS可以部署在任何物理機(jī),虛擬機(jī)或IaaS云之上。
持續(xù)集成和持續(xù)部署
互聯(lián)網(wǎng)行業(yè)提倡敏捷開發(fā),持續(xù)集成部署CI/CD便是最典型的開發(fā)模式。使用Docker容器云平臺(tái),就能實(shí)現(xiàn)從代碼編寫完成推送到Git/SVN后,自動(dòng)觸發(fā)后端CaaS平臺(tái)將代碼下載、編譯并構(gòu)建成測試Docker鏡像,再替換測試環(huán)境容器服務(wù),自動(dòng)在Jenkins或者Hudson中運(yùn)行單元/集成測試,測試通過后,馬上就能自動(dòng)將新版本鏡像更新到線上,完成服務(wù)升級(jí)。整個(gè)過程全自動(dòng)化,一氣呵成,大程度地簡化了運(yùn)維,而且保證線上、線下環(huán)境完全一致,而且線上服務(wù)版本與Git/SVN發(fā)布分支也實(shí)現(xiàn)統(tǒng)一。
解決微服務(wù)架構(gòu)的實(shí)施難題
基于Spring Cloud這樣的微服務(wù)框架,能夠?qū)崿F(xiàn)微服務(wù)的管理,但微服務(wù)本身還是需要運(yùn)行在操作系統(tǒng)上。一個(gè)采用微服務(wù)架構(gòu)開發(fā)的應(yīng)用中,微服務(wù)的個(gè)數(shù)往往很多,這就導(dǎo)致了一臺(tái)服務(wù)器上往往需要啟動(dòng)多個(gè)微服務(wù)來提高資源的利用率,而微服務(wù)本身可能就只能兼容部分操作系統(tǒng)。
這就導(dǎo)致了就算有大量的服務(wù)器資源(操作系統(tǒng)可能不一樣),但由于微服務(wù)本身與操作系統(tǒng)可能相關(guān),就不能做到讓微服務(wù)在任意服務(wù)器上運(yùn)行,這就帶來了資源的浪費(fèi)和運(yùn)維的困難。利用Docker容器的環(huán)境隔離能力,讓微服務(wù)運(yùn)行在容器內(nèi),就能夠解決以上所說的問題。
執(zhí)行臨時(shí)任務(wù)
有時(shí)候用戶只是想執(zhí)行一次性的任務(wù),但如果用傳統(tǒng)虛擬機(jī)的方式就要搭建環(huán)境,執(zhí)行完任務(wù)后還要釋放資源,比較麻煩。使用Docker容器就可以構(gòu)建臨時(shí)的運(yùn)行環(huán)境,執(zhí)行完任務(wù)后關(guān)閉容器即可,方便快捷。
多租戶環(huán)境
利用Docker的環(huán)境隔離能力,可以為不同的租戶提供獨(dú)占的容器,實(shí)現(xiàn)簡單而且成本較低。
11. 總結(jié)
Docker的技術(shù)并不神秘,只是整合了前人積累的各種成果實(shí)現(xiàn)的應(yīng)用級(jí)的容器化技術(shù),它利用各種Linux發(fā)行版中使用了版本兼容的內(nèi)核容器化技術(shù),來實(shí)現(xiàn)鏡像一次構(gòu)建到處運(yùn)行的效果,并且利用了容器內(nèi)的基礎(chǔ)操作系統(tǒng)鏡像層,屏蔽了實(shí)際運(yùn)行環(huán)境的操作系統(tǒng)差異,使用戶在開發(fā)應(yīng)用程序時(shí),只需確保在選定的操作系統(tǒng)和內(nèi)核版本上能正確運(yùn)行即可,幾乎不需要關(guān)心實(shí)際的運(yùn)行環(huán)境的系統(tǒng)差異,大大提高效率和兼容性。
但隨著容器運(yùn)行得越來越多,容器管理將會(huì)稱為另一個(gè)運(yùn)維的難題,這時(shí)候就需要引入Kubernetes、Mesos或Swarm這些容器管理系統(tǒng),后面有機(jī)會(huì)再介紹這些技術(shù)。
文章題目:技術(shù)選型之Docker容器引擎
鏈接地址:http://www.rwnh.cn/news/202471.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、外貿(mào)建站、服務(wù)器托管、自適應(yīng)網(wǎng)站、企業(yè)建站、網(wǎng)頁設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容