国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

服務(wù)器資訊|IT/互聯(lián)網(wǎng)|云計(jì)算|區(qū)塊鏈|軟件資訊|操作系統(tǒng)|手機(jī)數(shù)碼|百科知識|免費(fèi)資源|頭條新聞|

服務(wù)器之家 - 新聞資訊 - 云計(jì)算 - 技術(shù)選型之Docker容器引擎

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

2019-12-16 22:11Segmentfaulthuashiou 云計(jì)算

最近對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)、邏輯矛盾的問題。

最近對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)槟悴恢牢磥頃粫€要拿來再講幾遍。本文以PPT+講稿的方式編寫,權(quán)當(dāng)對自己這次技術(shù)分享做個(gè)記錄,歡迎大家拍磚。

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

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

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

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

為了做大數(shù)據(jù)相關(guān)項(xiàng)目,需要安裝一套CDH集群,常見的做法是在自己電腦里搭建3臺與CDH版本對應(yīng)的虛擬機(jī),把CDH集群裝起來后,考慮到以后很有可能還要使用一個(gè)干凈的CDH集群,為了避免以后重復(fù)安裝環(huán)境,通常會對整套CDH集群做一個(gè)備份,這樣電腦里就有6個(gè)虛擬機(jī)鏡像了。

另外,后面在學(xué)習(xí)其他技術(shù)時(shí),比如學(xué)習(xí)Ambari大數(shù)據(jù)集群,那么為了不破壞已有的虛擬機(jī)環(huán)境,又要重新搭建3臺虛擬機(jī),本機(jī)磁盤很快被一大堆的虛擬機(jī)鏡像占滿。

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

公司里往往會以小團(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版本升級了,算法跑通了,但Ambari用到python的部分功能可能就報(bào)錯了

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

小趙想利用服務(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)境,還需要對代碼進(jìn)行定制化修改,拉出分支,這樣導(dǎo)致了每次到現(xiàn)場升級都是一場噩夢

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

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

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

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

2. Docker是什么

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

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

首先說一下何為容器,Linux系統(tǒng)提供了Namespace和CGroup技術(shù)實(shí)現(xiàn)環(huán)境隔離和資源控制,其中Namespace是Linux提供的一種內(nèi)核級別環(huán)境隔離的方法,能使一個(gè)進(jìn)程和該進(jìn)程創(chuàng)建的子進(jìn)程的運(yùn)行空間都與Linux的超級父進(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ú)立且限定了資源的對象,這樣的對象稱為容器。

Linux Container是Linux系統(tǒng)提供的容器化技術(shù),簡稱LXC,它結(jié)合Namespace和CGroup技術(shù)為用戶提供了更易用的接口來實(shí)現(xiàn)容器化。LXC僅為一種輕量級的容器化技術(shù),它僅能對部分資源進(jìn)行限制,無法做到諸如網(wǎng)絡(luò)限制、磁盤空間占用限制等。dotCloud公司結(jié)合LXC和以下列出的技術(shù)實(shí)現(xiàn)了Docker容器引擎,相比于LXC,Docker具備更加全面的資源控制能力,是一種應(yīng)用級別的容器引擎。

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)容器的快速啟動和極少的資源占用,后面會專門介紹該文件系統(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ū)別

技術(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)是通過Hypervisor來最終分享硬件,所以虛擬機(jī)Guest OS發(fā)出的指令都需要被Hypervisor捕獲,然后翻譯為物理硬件或宿主機(jī)操作系統(tǒng)能夠識別的指令。

VMWare和VirtualBox等虛擬機(jī)在性能方面遠(yuǎn)不如裸機(jī),但基于硬件虛擬機(jī)的KVM約能發(fā)揮裸機(jī)80%的性能。這種虛擬化的優(yōu)點(diǎn)是不同虛擬機(jī)之間實(shí)現(xiàn)了完全隔離,安全性很高,并且能夠在一臺物理機(jī)上運(yùn)行多種內(nèi)核的操作系統(tǒng)(如Linux和Window),但每個(gè)虛擬機(jī)都很笨重,占用資源多而且啟動很慢。

Docker引擎運(yùn)行在操作系統(tǒng)上,是基于內(nèi)核的LXC、Chroot等技術(shù)實(shí)現(xiàn)容器的環(huán)境隔離和資源控制,在容器啟動后,容器里的進(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虛擬化工具自動創(chuàng)建了一個(gè)Linux系統(tǒng),容器內(nèi)的操作實(shí)際上是間接使用這個(gè)虛擬系統(tǒng)實(shí)現(xiàn)的。

4. Docker基本概念

技術(shù)選型之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的類比

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

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

上圖中Docker的鏡像倉庫類似于傳統(tǒng)虛擬機(jī)的鏡像倉庫或存放鏡像的本地文件系統(tǒng),Docker引擎啟動容器來運(yùn)行Spark集群(容器內(nèi)包含基礎(chǔ)的Linux操作系統(tǒng)環(huán)境),類比于虛擬機(jī)軟件啟動多個(gè)虛擬機(jī),在虛擬機(jī)內(nèi)分別運(yùn)行Spark進(jìn)程,兩者區(qū)別在于Docker容器內(nèi)的應(yīng)用在使用物理資源時(shí),直接與內(nèi)核打交道,無需經(jīng)過Docker引擎。

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

Docker的倉庫思想與Git是相同的。

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

Docker的口號是“Build,Ship,and Run Any App,Anywhere”,也就是可以基于Docker構(gòu)建、裝載和運(yùn)行應(yīng)用程序,一次構(gòu)建到處運(yùn)行。Java的口號是“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)啟動容器時(shí),雖然容器能夠啟動,但里面應(yīng)用的功能是無法正常運(yùn)行的,除非把宿主機(jī)的操作系統(tǒng)內(nèi)核升級到4.18版本。

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

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

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

這種分層結(jié)構(gòu)能充分共享鏡像層,能大大減少鏡像倉庫占用的空間,而對用戶而言,他們所看到的容器,其實(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)限,此外對于只讀的文件和目錄,它具有“Copy on Write(寫實(shí)復(fù)制)”的特點(diǎn),即如果對一個(gè)只讀的文件進(jìn)行修改,在修改前會先把文件復(fù)制一份到可寫層(可能是磁盤里的一個(gè)目錄),所有的修改操作其實(shí)都是對這個(gè)文件副本進(jìn)行修改,原來的只讀文件并不會變化。

其中一個(gè)使用UnionFS的例子是:Knoppix,一個(gè)用于Linux演示、光盤教學(xué)和商業(yè)產(chǎn)品演示的Linux發(fā)行版,它就是把一個(gè)CD/DVD和一個(gè)存在在可讀寫設(shè)備(例如U盤)聯(lián)合掛載,這樣在演示過程中任何對CD/DVD上文件的改動都會在被應(yīng)用在U盤上,不改變原來的CD/DVD上的內(nèi)容。

UnionFS有很多種,其中Docker中常用的是AUFS,這是UnionFS的升級版,除此之外還有DeviceMapper、Overlay2、ZFS和 VFS等。Docker鏡像的每一層默認(rèn)存放在/var/lib/docker/aufs/diff目錄中,當(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目錄中對應(yīng)的掛載目錄和文件運(yùn)行起來。

利用UnionFS寫實(shí)復(fù)制的特點(diǎn),在啟動一個(gè)容器時(shí), Docker引擎實(shí)際上只是增加了一個(gè)可寫層和構(gòu)造了一個(gè)Linux容器,這兩者都幾乎不消耗系統(tǒng)資源,因此Docker容器能夠做到秒級啟動,一臺服務(wù)器上能夠啟動上千個(gè)Docker容器,而傳統(tǒng)虛擬機(jī)在一臺服務(wù)器上啟動幾十個(gè)就已經(jīng)非常吃力了,而且虛擬機(jī)啟動很慢,這是Docker相比于傳統(tǒng)虛擬機(jī)的兩個(gè)巨大的優(yōu)勢。

當(dāng)應(yīng)用只是直接調(diào)用了內(nèi)核功能來運(yùn)作的情況下,應(yīng)用本身就能直接作為最底層的層來構(gòu)建鏡像,但因?yàn)槿萜鞅旧頃艚^環(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)系:

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

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

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

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

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

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

以上系統(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è)級服務(wù)器常用操作系統(tǒng),穩(wěn)定性高,大小約200MB,適合生產(chǎn)環(huán)境使用。

8. Docker持久化存儲

根據(jù)前面介紹的容器UnionFS寫實(shí)復(fù)制的特點(diǎn),可知在容器里增加、刪除或修改文件,其實(shí)都是對可寫層里的文件副本進(jìn)行了操作。在容器關(guān)閉后,該可寫層也會被刪除,對容器的所有修改都會失效,因此需要解決容器內(nèi)文件持久化的問題。Docker提供了兩種方案來實(shí)現(xiàn):

把宿主機(jī)文件系統(tǒng)里的目錄映射到容器內(nèi)的目錄,如下圖所示。如此一來,容器內(nèi)在該目錄里創(chuàng)建的所有文件,都存儲到宿主機(jī)的對應(yīng)目錄中,在關(guān)閉容器后,宿主機(jī)的目錄依然存在,再次啟動容器時(shí)還能讀取到之前創(chuàng)建的文件,因此實(shí)現(xiàn)了容器的文件持久化。

當(dāng)然同時(shí)要明白,如果是對鏡像自帶文件進(jìn)行了修改,由于鏡像是只讀的,該修改操作無法在關(guān)閉容器時(shí)保存下來,除非在修改了文件后構(gòu)建一個(gè)新的鏡像。

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

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

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

9. Docker鏡像制作方法

鏡像制作方法有兩種:

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

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

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

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

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

(2)通過Dockerfile文件來生成新鏡像

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

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

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

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

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

10. Docker的使用場景

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

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

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

作為云主機(jī)使用

結(jié)合Kubernetes這樣的容器管理系統(tǒng),可以在大量服務(wù)器上動態(tài)分配和管理容器,在公司內(nèi)部,甚至可以取代VMWare這樣的虛擬機(jī)管理平臺,使用Docker容器作為云主機(jī)使用;

應(yīng)用服務(wù)打包

在Web應(yīng)用服務(wù)開發(fā)場景,可以把Java運(yùn)行環(huán)境、Tomcat服務(wù)器打包為一個(gè)基礎(chǔ)鏡像,在修改了代碼包后加入到基礎(chǔ)鏡像來構(gòu)建一個(gè)新的鏡像,能很方便的升級服務(wù)和控制版本;

容器云平臺CaaS

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

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

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

SaaS(軟件即服務(wù)):將應(yīng)用作為服務(wù)提供給客戶。用戶只要接上網(wǎng)絡(luò),并通過瀏覽器,就能直接使用在云端上運(yùn)行的應(yīng)用,而不需要顧慮類似安裝等瑣事,并且免去初期高昂的軟硬件投入。SaaS主要面對的是普通的用戶。

CaaS(容器即服務(wù)):完成IaaS和PaaS兩個(gè)層級的功能。相對于傳統(tǒng)的IaaS和PaaS服務(wù),CaaS對底層的支持比PaaS更靈活,而對上層應(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容器云平臺,就能實(shí)現(xiàn)從代碼編寫完成推送到Git/SVN后,自動觸發(fā)后端CaaS平臺將代碼下載、編譯并構(gòu)建成測試Docker鏡像,再替換測試環(huán)境容器服務(wù),自動在Jenkins或者Hudson中運(yùn)行單元/集成測試,測試通過后,馬上就能自動將新版本鏡像更新到線上,完成服務(wù)升級。整個(gè)過程全自動化,一氣呵成,最大程度地簡化了運(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)致了一臺服務(wù)器上往往需要啟動多個(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)用級的容器化技術(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)行得越來越多,容器管理將會稱為另一個(gè)運(yùn)維的難題,這時(shí)候就需要引入Kubernetes、Mesos或Swarm這些容器管理系統(tǒng),后面有機(jī)會再介紹這些技術(shù)。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 国产一区二区三区免费 | 欧美一区二区三区视频在线 | 亚洲一区二区精品视频 | 国产精品免费观看 | 激情网页| 午夜天堂精品久久久久 | 性做久久久 | 久久人| 成人免费网站在线观看 | 久久综合久色欧美综合狠狠 | 九九九色 | 97久久精品午夜一区二区 | 一本久久a久久精品亚洲 | 国产精品亚洲精品 | 91精品国产91久久久久久吃药 | 亚洲成人av一区二区三区 | 精品在线一区二区三区 | 欧美国产精品一区二区三区 | 99久久夜色精品国产网站 | 国产亚洲欧美美 | 可以免费看黄色的网站 | 亚洲精品久久久久久动漫 | 国产精品激情在线观看 | 久久这里有精品视频 | 在线免费观看激情视频 | 国产精品一区二区三区不卡 | 中文字幕国产视频 | 欧美一级欧美三级在线观看 | 日韩av一区二区在线观看 | 国产日产欧产美韩av | 欧美日韩一区二区三区视频 | 亚洲精品久久久久久国产精华液 | 亚洲伦理一区 | 久久久久a| 国产精品毛片久久久久久久明星 | av在线免费网址 | 亚洲精品国产电影 | 国产精品1| 亚洲一级在线 | 日韩中文在线 | 91电影在线|