技術(shù)選型之Docker容器引擎

2022-10-06    分類: 網(wǎng)站建設(shè)

最近對(duì)Docker和Kubernetes進(jìn)行了一番學(xué)習(xí),前兩天做了一次技術(shù)分享,回去聽(tīng)了一遍自己演講的錄音,發(fā)現(xiàn)單單PPT做好還是遠(yuǎn)遠(yuǎn)不夠的,沒(méi)有提前準(zhǔn)備好邏輯嚴(yán)謹(jǐn)?shù)闹v稿,在講的時(shí)候出現(xiàn)了卡殼、漏掉技術(shù)點(diǎn)、邏輯矛盾的問(wèn)題。

為了解決這個(gè)問(wèn)題,我打算以后在做技術(shù)分享前,都按著PPT的內(nèi)容先寫(xiě)成博客,理順表達(dá)邏輯。另外,我覺(jué)得每次技術(shù)分享使用的PPT都應(yīng)該盡可能的做好,因?yàn)槟悴恢牢磥?lái)會(huì)不會(huì)還要拿來(lái)再講幾遍。本文以PPT+講稿的方式編寫(xiě),權(quán)當(dāng)對(duì)自己這次技術(shù)分享做個(gè)記錄,歡迎大家拍磚。

技術(shù)選型之Docker容器引擎

1. Docker出現(xiàn)的背景

在平常的研發(fā)和項(xiàng)目場(chǎng)景中,以下情況普遍存在:

個(gè)人開(kāi)發(fā)環(huán)境

為了做大數(shù)據(jù)相關(guān)項(xiàng)目,需要安裝一套CDH集群,常見(jiàn)的做法是在自己電腦里搭建3臺(tái)與CDH版本對(duì)應(yīng)的虛擬機(jī),把CDH集群裝起來(lái)后,考慮到以后很有可能還要使用一個(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ī)磁盤(pán)很快被一大堆的虛擬機(jī)鏡像占滿。

公司內(nèi)部開(kāi)發(fā)環(huán)境

公司里往往會(huì)以小團(tuán)隊(duì)的方式來(lái)做項(xiàng)目,一般由運(yùn)維部門從他們管理的服務(wù)器資源中分配出虛擬機(jī)供團(tuán)隊(duì)內(nèi)部開(kāi)發(fā)測(cè)試使用。比如做一個(gè)與機(jī)器學(xué)習(xí)相關(guān)的項(xiàng)目:

小明在運(yùn)維部門分配的虛擬機(jī)上搭建了一套Ambari集群,拿來(lái)跑大數(shù)據(jù)相關(guān)業(yè)務(wù)

小剛用python3寫(xiě)了一個(gè)機(jī)器學(xué)習(xí)算法,放到虛擬機(jī)上運(yùn)行發(fā)現(xiàn)虛擬機(jī)里是python2,算法不兼容,于是把虛擬機(jī)里的python版本升級(jí)了,算法跑通了,但Ambari用到python的部分功能可能就報(bào)錯(cuò)了

小李開(kāi)發(fā)了應(yīng)用,放到虛擬機(jī)上啟動(dòng)tomcat,發(fā)現(xiàn)虛擬機(jī)里的是OpenJDK,導(dǎo)致tomcat起不來(lái),于是又安裝了一個(gè)JDK,這時(shí)候可能Ambari里的Java代碼可能就報(bào)錯(cuò)了

小趙想利用服務(wù)器資源做性能測(cè)試,發(fā)現(xiàn)虛擬機(jī)嚴(yán)重削減了性能,最終還是要直接找物理機(jī)來(lái)跑測(cè)試,破壞了物理機(jī)原來(lái)的環(huán)境

做完項(xiàng)目后,這些虛擬機(jī)上安裝的東西往往變得沒(méi)用了,下個(gè)項(xiàng)目組來(lái)還是得新申請(qǐng)?zhí)摂M機(jī)重新部署軟件

開(kāi)發(fā)/測(cè)試/現(xiàn)場(chǎng)環(huán)境

研發(fā)人員在開(kāi)發(fā)環(huán)境里寫(xiě)好了代碼做好測(cè)試后,提交給測(cè)試部門,測(cè)試人員在測(cè)試環(huán)境跑起來(lái)發(fā)現(xiàn)有BUG,研發(fā)人員說(shuō)在開(kāi)發(fā)環(huán)境沒(méi)這個(gè)BUG,和測(cè)試人員多次扯皮解決BUG后發(fā)布版本,發(fā)到現(xiàn)場(chǎng)在生產(chǎn)環(huán)境部署后,又發(fā)現(xiàn)有BUG,這下輪到工程人員和測(cè)試人員扯皮。有時(shí)候?yàn)榱思嫒萏厥獾默F(xiàn)場(chǎng)環(huán)境,還需要對(duì)代碼進(jìn)行定制化修改,拉出分支,這樣導(dǎo)致了每次到現(xiàn)場(chǎng)升級(jí)都是一場(chǎng)噩夢(mèng)

升級(jí)或遷移項(xiàng)目

在每次發(fā)版本要升級(jí)到現(xiàn)場(chǎng)時(shí),如果現(xiàn)場(chǎng)起了多個(gè)tomcat應(yīng)用,那么需要對(duì)每個(gè)tomcat都先停掉,替換war包,然后再起起來(lái),輪流著做,不僅繁瑣而且很容易出錯(cuò),如果遇到升級(jí)后出現(xiàn)嚴(yán)重BUG,還要手工做回退。

另外,如果項(xiàng)目想上云,那么在云上部署后要重新進(jìn)行一輪測(cè)試,如果后面考慮還云廠商,可能相同的測(cè)試還要再進(jìn)行一次(比如更換了數(shù)據(jù)存儲(chǔ)組件),費(fèi)時(shí)費(fèi)力。

總結(jié)以上列舉的所有場(chǎng)景,他們存在的一個(gè)共同的問(wèn)題是:沒(méi)有一種既能夠屏蔽操作系統(tǒng)差異,又能夠以不降低性能的方式來(lái)運(yùn)行應(yīng)用的技術(shù),來(lái)解決環(huán)境依賴的問(wèn)題。Docker應(yīng)運(yùn)而生。

2. Docker是什么

技術(shù)選型之Docker容器引擎

Docker是一種應(yīng)用容器引擎。

首先說(shuō)一下何為容器,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ù)來(lái)控制一個(gè)進(jìn)程組群可使用的資源(如CPU、內(nèi)存、磁盤(pán)IO等),把這兩種技術(shù)結(jié)合起來(lái),就能構(gòu)造一個(gè)用戶空間獨(dú)立且限定了資源的對(duì)象,這樣的對(duì)象稱為容器。

Linux Container是Linux系統(tǒng)提供的容器化技術(shù),簡(jiǎn)稱LXC,它結(jié)合Namespace和CGroup技術(shù)為用戶提供了更易用的接口來(lái)實(shí)現(xiàn)容器化。LXC僅為一種輕量級(jí)的容器化技術(shù),它僅能對(duì)部分資源進(jìn)行限制,無(wú)法做到諸如網(wǎng)絡(luò)限制、磁盤(pán)空間占用限制等。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:通過(guò)這兩個(gè)技術(shù)實(shí)現(xiàn)控制container網(wǎng)絡(luò)訪問(wèn)策略;

TC:該技術(shù)主要用來(lái)做流量隔離,限制帶寬;

Quota:該技術(shù)用來(lái)限制磁盤(pán)讀寫(xiě)空間的大小;

Setrlimit:該技術(shù)用來(lái)限制container中打開(kāi)的進(jìn)程數(shù),限制打開(kāi)的文件個(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ū)別

技術(shù)選型之Docker容器引擎

傳統(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)是通過(guò)Hypervisor來(lái)最終分享硬件,所以虛擬機(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)核交互,無(wú)需經(jīng)過(guò)Docker引擎中轉(zhuǎn),因此幾乎沒(méi)有性能損耗,能發(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基本概念

技術(shù)選型之Docker容器引擎

Docker主要有如下幾個(gè)概念:

引擎:創(chuàng)建和管理容器的工具,通過(guò)讀取鏡像來(lái)生成容器,并負(fù)責(zé)從倉(cāng)庫(kù)拉取鏡像或提交鏡像到倉(cāng)庫(kù)中;

鏡像:類似于虛擬機(jī)鏡像,一般由一個(gè)基本操作系統(tǒng)環(huán)境和多個(gè)應(yīng)用程序打包而成,是創(chuàng)建容器的模板;

容器:可看作一個(gè)簡(jiǎn)易版的Linxu系統(tǒng)環(huán)境(包括root用戶權(quán)限、進(jìn)程空間、用戶空間和網(wǎng)絡(luò)空間等)以及運(yùn)行在其中的應(yīng)用程序打包而成的盒子;

倉(cāng)庫(kù):集中存放鏡像文件的場(chǎng)所,分為公共倉(cāng)庫(kù)和私有倉(cāng)庫(kù),目前大的公共倉(cāng)庫(kù)是官方提供的Docker Hub,此外國(guó)內(nèi)的阿里云、騰訊云等也提供了公共倉(cāng)庫(kù);

宿主機(jī):運(yùn)行引擎的操作系統(tǒng)所在服務(wù)器。

5. Docker與虛擬機(jī)、Git、JVM的類比

為了讓大家對(duì)Docker有更直觀的認(rèn)識(shí),下面分別進(jìn)行三組類比:

技術(shù)選型之Docker容器引擎

上圖中Docker的鏡像倉(cāng)庫(kù)類似于傳統(tǒng)虛擬機(jī)的鏡像倉(cāng)庫(kù)或存放鏡像的本地文件系統(tǒng),Docker引擎啟動(dòng)容器來(lái)運(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)核打交道,無(wú)需經(jīng)過(guò)Docker引擎。

技術(shù)選型之Docker容器引擎

Docker的倉(cāng)庫(kù)思想與Git是相同的。

技術(shù)選型之Docker容器引擎

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”,即一次編寫(xiě)到處運(yùn)行。

Java是基于JVM適配操作系統(tǒng)的特點(diǎn)來(lái)屏蔽系統(tǒng)的差異,Docker則是利用內(nèi)核版本兼容性的特點(diǎn)來(lái)實(shí)現(xiàn)一次構(gòu)建導(dǎo)出運(yùn)行,只要Linux系統(tǒng)的內(nèi)核是3.8或更高的版本,就都能把容器跑起來(lái)。

當(dāng)然,正如Java中如果應(yīng)用代碼使用了JDK10的新特性,基于JDK8就無(wú)法運(yùn)行一樣,如果容器內(nèi)的應(yīng)用使用了4.18版本的內(nèi)核特性,那么在CentOS7(內(nèi)核版本為3.10)啟動(dòng)容器時(shí),雖然容器能夠啟動(dòng),但里面應(yīng)用的功能是無(wú)法正常運(yùn)行的,除非把宿主機(jī)的操作系統(tǒng)內(nèi)核升級(jí)到4.18版本。

6. Docker鏡像文件系統(tǒng)

技術(shù)選型之Docker容器引擎

Docker鏡像采用分層存儲(chǔ)格式,每個(gè)鏡像可依賴其他鏡像進(jìn)行構(gòu)建,每一層的鏡像可被多個(gè)鏡像引用,上圖的鏡像依賴關(guān)系,K8S鏡像其實(shí)是CentOS+GCC+GO+K8S這四個(gè)軟件結(jié)合的鏡像。

這種分層結(jié)構(gòu)能充分共享鏡像層,能大大減少鏡像倉(cāng)庫(kù)占用的空間,而對(duì)用戶而言,他們所看到的容器,其實(shí)是Docker利用UnionFS(聯(lián)合文件系統(tǒng))把相關(guān)鏡像層的目錄“聯(lián)合”到同一個(gè)掛載點(diǎn)呈現(xiàn)出來(lái)的一個(gè)整體,這里需要簡(jiǎn)單介紹一個(gè)UnionFS是什么:

UnionFS可以把多個(gè)物理位置獨(dú)立的目錄(也叫分支)內(nèi)容聯(lián)合掛載到同一個(gè)目錄下,UnionFS允許控制這些目錄的讀寫(xiě)權(quán)限,此外對(duì)于只讀的文件和目錄,它具有“Copy on Write(寫(xiě)實(shí)復(fù)制)”的特點(diǎn),即如果對(duì)一個(gè)只讀的文件進(jìn)行修改,在修改前會(huì)先把文件復(fù)制一份到可寫(xiě)層(可能是磁盤(pán)里的一個(gè)目錄),所有的修改操作其實(shí)都是對(duì)這個(gè)文件副本進(jìn)行修改,原來(lái)的只讀文件并不會(huì)變化。

其中一個(gè)使用UnionFS的例子是:Knoppix,一個(gè)用于Linux演示、光盤(pán)教學(xué)和商業(yè)產(chǎn)品演示的Linux發(fā)行版,它就是把一個(gè)CD/DVD和一個(gè)存在在可讀寫(xiě)設(shè)備(例如U盤(pán))聯(lián)合掛載,這樣在演示過(guò)程中任何對(duì)CD/DVD上文件的改動(dòng)都會(huì)在被應(yīng)用在U盤(pán)上,不改變?cè)瓉?lái)的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è)可讀寫(xiě)層目錄,然后使用UnionFS把該可讀寫(xiě)層目錄和指定鏡像的各層目錄聯(lián)合掛載到/var/lib/docker/aufs/mnt里的一個(gè)目錄中(其中指定鏡像的各層目錄都以只讀方式掛載),通過(guò)LXC等技術(shù)進(jìn)行環(huán)境隔離和資源控制,使容器里的應(yīng)用僅依賴mnt目錄中對(duì)應(yīng)的掛載目錄和文件運(yùn)行起來(lái)。

利用UnionFS寫(xiě)實(shí)復(fù)制的特點(diǎn),在啟動(dòng)一個(gè)容器時(shí), Docker引擎實(shí)際上只是增加了一個(gè)可寫(xiě)層和構(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)勢(shì)。

當(dāng)應(yīng)用只是直接調(diào)用了內(nèi)核功能來(lái)運(yùn)作的情況下,應(yīng)用本身就能直接作為最底層的層來(lái)構(gòu)建鏡像,但因?yàn)槿萜鞅旧頃?huì)隔絕環(huán)境,因此容器內(nèi)部是無(wú)法訪問(wèn)宿主機(jī)里文件的(除非指定了某些目錄或文件映射到容器內(nèi)),這種情況下應(yīng)用代碼就只能使用內(nèi)核的功能。

但是Linux內(nèi)核僅提供了進(jìn)程管理、內(nèi)存管理、文件系統(tǒng)管理等一些基礎(chǔ)且底層的管理功能,在實(shí)際的場(chǎng)景中,幾乎所有軟件都是基于操作系統(tǒng)來(lái)開(kāi)發(fā)的,因此往往都需要依賴操作系統(tǒng)的軟件和運(yùn)行庫(kù)等,如果這些應(yīng)用的下一層直接是內(nèi)核,那么應(yīng)用將無(wú)法運(yùn)行。所以實(shí)際上應(yīng)用鏡像往往底層都是基于一個(gè)操作系統(tǒng)鏡像來(lái)補(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)行庫(kù)等,可把操作系統(tǒng)鏡像看作內(nèi)核之上的一個(gè)應(yīng)用,一個(gè)封裝了內(nèi)核功能,并為用戶編寫(xiě)的應(yīng)用提供運(yùn)行環(huán)境的工具。

應(yīng)用基于這樣的鏡像構(gòu)建,就能夠利用上相應(yīng)操作系統(tǒng)的各種軟件的功能和運(yùn)行庫(kù),此外,由于應(yīng)用是基于操作系統(tǒng)鏡像來(lái)構(gòu)建的,就算換到另外的服務(wù)器,只要操作系統(tǒng)鏡像中被應(yīng)用使用到的功能能適配宿主機(jī)的內(nèi)核,應(yīng)用就能正常運(yùn)行,這就是一次構(gòu)建到處運(yùn)行的原因。

下圖形象的表現(xiàn)出了鏡像和容器的關(guān)系:

技術(shù)選型之Docker容器引擎

上圖中Apache應(yīng)用基于emacs鏡像構(gòu)建,emacs基于Debian系統(tǒng)鏡像構(gòu)建,在啟動(dòng)為容器時(shí),在Apache鏡像層之上構(gòu)造了一個(gè)可寫(xiě)層,對(duì)容器本身的修改操作都在可寫(xiě)層中進(jìn)行。Debian是該鏡像的基礎(chǔ)鏡像(Base Image),它提供了內(nèi)核Kernel的更高級(jí)的封裝。同時(shí)其他的鏡像也是基于同一個(gè)內(nèi)核來(lái)構(gòu)建的(以下的BusyBox是一個(gè)精簡(jiǎn)版的操作系統(tǒng)鏡像):

技術(shù)選型之Docker容器引擎

這時(shí)候就會(huì)有一個(gè)問(wèn)題,應(yīng)用基于操作系統(tǒng)鏡像來(lái)構(gòu)建,那如果操作系統(tǒng)鏡像本身就很占空間,豈不是鏡像的分發(fā)不方便,而且鏡像倉(cāng)庫(kù)占用的空間也會(huì)很大。有人已經(jīng)考慮到這一點(diǎn),針對(duì)不同的場(chǎng)景分別構(gòu)造了不同的操作系統(tǒng)鏡像,下面介紹幾種最常用的系統(tǒng)鏡像。

7. Docker基礎(chǔ)操作系統(tǒng)

技術(shù)選型之Docker容器引擎

以上系統(tǒng)鏡像分別適用于不同的場(chǎng)景:

BusyBox:一個(gè)極簡(jiǎn)版的Linux系統(tǒng),集成了100多種常用Linux命令,大小不到2MB,被稱為“Linux系統(tǒng)的瑞士軍刀”,適用于簡(jiǎn)單測(cè)試場(chǎ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寫(xiě)實(shí)復(fù)制的特點(diǎn),可知在容器里增加、刪除或修改文件,其實(shí)都是對(duì)可寫(xiě)層里的文件副本進(jìn)行了操作。在容器關(guān)閉后,該可寫(xiě)層也會(huì)被刪除,對(duì)容器的所有修改都會(huì)失效,因此需要解決容器內(nèi)文件持久化的問(wèn)題。Docker提供了兩種方案來(lái)實(shí)現(xiàn):

把宿主機(jī)文件系統(tǒng)里的目錄映射到容器內(nèi)的目錄,如下圖所示。如此一來(lá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)行了修改,由于鏡像是只讀的,該修改操作無(wú)法在關(guān)閉容器時(shí)保存下來(lái),除非在修改了文件后構(gòu)建一個(gè)新的鏡像。

技術(shù)選型之Docker容器引擎

把多臺(tái)宿主機(jī)的磁盤(pán)目錄通過(guò)網(wǎng)絡(luò)聯(lián)合為共享存儲(chǔ),然后把共享存儲(chǔ)中的特定目錄映射給特定的容器,如下圖所示。這樣容器在重啟時(shí),還是能讀取到關(guān)閉前創(chuàng)建的文件。生產(chǎn)環(huán)境中常用NFS作為共享存儲(chǔ)方案。

技術(shù)選型之Docker容器引擎

9. Docker鏡像制作方法

鏡像制作方法有兩種:

(1)通過(guò)正在運(yùn)行的容器生成新鏡像

技術(shù)選型之Docker容器引擎

當(dāng)一個(gè)容器在運(yùn)行時(shí),在里面所有的修改都會(huì)體現(xiàn)在容器的可寫(xiě)層,Docker提供了commit命令,可以把正在運(yùn)行的容器,疊加上可寫(xiě)層的修改內(nèi)容,生成一個(gè)新鏡像。

如上圖所示,在容器里新安裝Spark組件的,如果關(guān)閉容器,Spark組件會(huì)隨著可寫(xiě)層的消失而消失,如果在關(guān)閉容器之前使用commit命令生成新鏡像,那么使用新鏡像啟動(dòng)為容器時(shí),容器里就會(huì)包含Spark組件。

這種方式比較簡(jiǎn)單,但無(wú)法直觀的設(shè)置環(huán)境變量、監(jiān)聽(tīng)端口等內(nèi)容,適合在簡(jiǎn)單使用的場(chǎng)景運(yùn)用。

(2)通過(guò)Dockerfile文件來(lái)生成新鏡像

技術(shù)選型之Docker容器引擎

Dockerfile是一個(gè)定義了鏡像創(chuàng)建步驟的文件,Docker引擎通過(guò)build命令讀取Dockerfile,按定義的步驟來(lái)一步步構(gòu)造鏡像。在研發(fā)和實(shí)施環(huán)境中,通過(guò)Dockerfile 創(chuàng)建容器是主流做法。

下面是一個(gè)Dockerfile的例子:

技術(shù)選型之Docker容器引擎

Docker引擎可以根據(jù)以上Dockerfile定義的步驟,構(gòu)造出一個(gè)帶有ssh服務(wù)的Ubuntu鏡像。

10. Docker的使用場(chǎng)景

Docker作為一種輕量級(jí)的虛擬化方案,應(yīng)用場(chǎng)景十分豐富,下面收集了一些常見(jiàn)的場(chǎng)景:

作為輕量級(jí)虛擬機(jī)使用

可以使用Ubuntu等系統(tǒng)鏡像創(chuàng)建容器,當(dāng)作虛擬機(jī)來(lái)使用,相比于傳統(tǒng)虛擬機(jī),啟動(dòng)速度更快,資源占用更少,單機(jī)可以啟動(dòng)大量的操作系統(tǒng)容器,方便進(jìn)行各種測(cè)試;

作為云主機(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ù)開(kāi)發(fā)場(chǎng)景,可以把Java運(yùn)行環(huán)境、Tomcat服務(wù)器打包為一個(gè)基礎(chǔ)鏡像,在修改了代碼包后加入到基礎(chǔ)鏡像來(lái)構(gòu)建一個(gè)新的鏡像,能很方便的升級(jí)服務(wù)和控制版本;

容器云平臺(tái)CaaS

Docker的出現(xiàn),使得很多云平臺(tái)供應(yīng)商開(kāi)始提供容器云的服務(wù),簡(jiǎn)稱容器即服務(wù)CaaS,以下對(duì)比一下IaaS、PaaS和SaaS:

IaaS(基礎(chǔ)設(shè)施即服務(wù)):提供虛擬機(jī)或者其他基礎(chǔ)資源作為服務(wù)提供給用戶。用戶可以從供應(yīng)商那里獲得虛擬機(jī)或者存儲(chǔ)等資源來(lái)裝載相關(guān)的應(yīng)用,同時(shí)這些基礎(chǔ)設(shè)施的繁瑣的管理工作將由IaaS供應(yīng)商來(lái)處理。其主要的用戶是企業(yè)的系統(tǒng)管理員和運(yùn)維人員;

PaaS(平臺(tái)即服務(wù)):把開(kāi)發(fā)平臺(tái)作為服務(wù)提供給用戶。用戶可以在一個(gè)包括SDK,文檔和測(cè)試環(huán)境等在內(nèi)的開(kāi)發(fā)平臺(tái)上非常方便地編寫(xiě)應(yīng)用,而且不論是在部署,或者在運(yùn)行的時(shí)候,用戶都無(wú)需為服務(wù)器、操作系統(tǒng)、網(wǎng)絡(luò)和存儲(chǔ)等資源的管理操心,這些繁瑣的工作都由PaaS供應(yīng)商負(fù)責(zé)處理。其主要的用戶是企業(yè)開(kāi)發(fā)人員。

SaaS(軟件即服務(wù)):將應(yīng)用作為服務(wù)提供給客戶。用戶只要接上網(wǎng)絡(luò),并通過(guò)瀏覽器,就能直接使用在云端上運(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è)提倡敏捷開(kāi)發(fā),持續(xù)集成部署CI/CD便是最典型的開(kāi)發(fā)模式。使用Docker容器云平臺(tái),就能實(shí)現(xiàn)從代碼編寫(xiě)完成推送到Git/SVN后,自動(dòng)觸發(fā)后端CaaS平臺(tái)將代碼下載、編譯并構(gòu)建成測(cè)試Docker鏡像,再替換測(cè)試環(huán)境容器服務(wù),自動(dòng)在Jenkins或者Hudson中運(yùn)行單元/集成測(cè)試,測(cè)試通過(guò)后,馬上就能自動(dòng)將新版本鏡像更新到線上,完成服務(wù)升級(jí)。整個(gè)過(guò)程全自動(dòng)化,一氣呵成,大程度地簡(jiǎn)化了運(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)開(kāi)發(fā)的應(yīng)用中,微服務(wù)的個(gè)數(shù)往往很多,這就導(dǎo)致了一臺(tái)服務(wù)器上往往需要啟動(dòng)多個(gè)微服務(wù)來(lái)提高資源的利用率,而微服務(wù)本身可能就只能兼容部分操作系統(tǒng)。

這就導(dǎo)致了就算有大量的服務(wù)器資源(操作系統(tǒng)可能不一樣),但由于微服務(wù)本身與操作系統(tǒng)可能相關(guān),就不能做到讓微服務(wù)在任意服務(wù)器上運(yùn)行,這就帶來(lái)了資源的浪費(fèi)和運(yùn)維的困難。利用Docker容器的環(huán)境隔離能力,讓微服務(wù)運(yùn)行在容器內(nèi),就能夠解決以上所說(shuō)的問(wèn)題。

執(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)簡(jiǎn)單而且成本較低。

11. 總結(jié)

Docker的技術(shù)并不神秘,只是整合了前人積累的各種成果實(shí)現(xiàn)的應(yīng)用級(jí)的容器化技術(shù),它利用各種Linux發(fā)行版中使用了版本兼容的內(nèi)核容器化技術(shù),來(lái)實(shí)現(xiàn)鏡像一次構(gòu)建到處運(yùn)行的效果,并且利用了容器內(nèi)的基礎(chǔ)操作系統(tǒng)鏡像層,屏蔽了實(shí)際運(yùn)行環(huán)境的操作系統(tǒng)差異,使用戶在開(kāi)發(fā)應(yīng)用程序時(shí),只需確保在選定的操作系統(tǒng)和內(nèi)核版本上能正確運(yùn)行即可,幾乎不需要關(guān)心實(shí)際的運(yùn)行環(huán)境的系統(tǒng)差異,大大提高效率和兼容性。

但隨著容器運(yùn)行得越來(lái)越多,容器管理將會(huì)稱為另一個(gè)運(yùn)維的難題,這時(shí)候就需要引入Kubernetes、Mesos或Swarm這些容器管理系統(tǒng),后面有機(jī)會(huì)再介紹這些技術(shù)。

Docker容器引擎

文章題目:技術(shù)選型之Docker容器引擎
鏈接地址:http://bm7419.com/news/202471.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、外貿(mào)建站、服務(wù)器托管、自適應(yīng)網(wǎng)站、企業(yè)建站、網(wǎng)頁(yè)設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)