您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Docker基本概念和框架的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
一種虛擬化的方案
操作系統(tǒng)級(jí)別的虛擬化
只能運(yùn)行相同或相似的內(nèi)核操作系統(tǒng)
依賴于Linux內(nèi)核特性:Namespace和Cgroups(Control Group)
從圖中我們很容器看出,容器技術(shù)資源占用比較少,由于虛擬機(jī)需要模擬硬件的行為,對(duì)CUP和內(nèi)存的損耗比較大。所以同樣配置的服務(wù)器,容器技術(shù)就有以下優(yōu)點(diǎn):
資源占用比較少
CPU/內(nèi)存消耗低
那既然容器有這些優(yōu)點(diǎn),為什么直到Docker的出現(xiàn),才真正的被關(guān)注呢?一個(gè)重要原因就是容器技術(shù)的復(fù)雜性。容器本身就很復(fù)雜,他依賴于Linux內(nèi)核的很多特性,而且他不易安裝,也不易于管理和實(shí)現(xiàn)自動(dòng)化。而Docker就是為了改變這一切而產(chǎn)生的。
將應(yīng)用自動(dòng)部署到容器的開源引擎
Go語言實(shí)現(xiàn)的開源項(xiàng)目,誕生于2013年初,最初發(fā)起者是dotCloud公司
提供簡(jiǎn)單輕量的建模方式:簡(jiǎn)單,Docker非常容器上手,用戶只需要幾分鐘,就能把自己的項(xiàng)目Docker化。
職責(zé)的邏輯分離:使用Docker,開發(fā)人員只需要關(guān)心容器中運(yùn)行的程序,運(yùn)維人員只需要關(guān)心如何管理容器;Docker設(shè)計(jì)的目的就是加強(qiáng)開發(fā)人員寫代碼的環(huán)境與應(yīng)用程序要部署的生成環(huán)境的一致性。
快速高效的開發(fā)生命周期:Docker的目標(biāo)之一是縮短代碼開發(fā)到測(cè)試到部署上線的運(yùn)行周期,讓應(yīng)用程序具備可移植性,在容器中開發(fā),以容器的形式交付和分發(fā),這樣開發(fā)、測(cè)試、生產(chǎn),都使用相同的環(huán)境,這樣也就避免了額外的調(diào)試和部署上的開銷,這樣就能有效的縮短產(chǎn)品的上線周期。
鼓勵(lì)使用面向服務(wù)的架構(gòu):Docker推薦單個(gè)容器只運(yùn)行一個(gè)應(yīng)用程序或者進(jìn)程,這樣就形成了一個(gè)分布式的應(yīng)用程序模型,在這種模式下應(yīng)用程序或服務(wù)都可以表述為一系列內(nèi)部互聯(lián)的容器,從而使分布式部署應(yīng)用程序擴(kuò)展或調(diào)試都變得非常簡(jiǎn)單。這就像我們開發(fā)中常用的思想;高內(nèi)聚,低耦合,單一任務(wù)。這樣就能避免在同一服務(wù)器上部署不同服務(wù)時(shí),可能帶來的服務(wù)之間相互影響。這樣服務(wù)運(yùn)行中出現(xiàn)問題時(shí),也比較容易定位問題的所在。
1. 使用Docker容器開發(fā)、測(cè)試、部署服務(wù):因?yàn)镈ocker本身非常輕量化,所以本地開發(fā)人員可以構(gòu)建、運(yùn)行并分享Docker容器。容器可以在開發(fā)環(huán)境中創(chuàng)建,然后再提交到測(cè)試,最終進(jìn)入生產(chǎn)環(huán)境。
2. 創(chuàng)建隔離的運(yùn)行環(huán)境:在很多企業(yè)應(yīng)用中,同一服務(wù)的不同版本可能服務(wù)于不同的用戶,那么使用Docker非常容易創(chuàng)建不同的生成環(huán)境來運(yùn)行不同的服務(wù)。
3. 搭建測(cè)試環(huán)境:由于Docker的輕量化,所以開發(fā)者很容易利用Docker在本地搭建測(cè)試環(huán)境,用來測(cè)試程序在不用系統(tǒng)下的兼容性;甚至搭建集群的部署測(cè)試。
4. 構(gòu)建多用戶的平臺(tái)即服務(wù)(PaaS)基礎(chǔ)設(shè)施。
5. 提供軟件即服務(wù)(SaaS)應(yīng)用程序。
6. 高性能、超大規(guī)模的宿主機(jī)部署。
Docker 包含了一下幾個(gè)重要主要部分:
Docker Client 客戶端
Docker Daemon 守護(hù)進(jìn)程
Docker Image 鏡像
Docker Container 容器
Docker Registry 倉庫
Docker是C/S架構(gòu)的程序:Docker客戶端向Docker服務(wù)器端,也就是Docker的守護(hù)進(jìn)程發(fā)出請(qǐng)求,守護(hù)進(jìn)程處理完所有的請(qǐng)求工作并返回結(jié)果。
Docker 客戶端對(duì)服務(wù)器端的訪問既可以是本地也可以通過遠(yuǎn)程來訪問。
鏡像是Docker容器的基石,容器基于鏡像啟動(dòng)和運(yùn)行。鏡像就好比容器的源代碼,保存了用于啟動(dòng)容器的各種條件。
Docker鏡像是一個(gè)層疊的只讀文件系統(tǒng)。
Docker鏡像使用聯(lián)合加載技術(shù)
docker的鏡像是一個(gè)層疊的只讀文件系統(tǒng),最低端是一個(gè)引導(dǎo)文件系統(tǒng)(即bootfs),第二層是root文件系統(tǒng)(即rootfs),它位于bootfs之上,可以是一種或多種操作系統(tǒng),比如ubuntu或者centos。在docker中,root文件系統(tǒng)永遠(yuǎn)只能是只讀狀態(tài),并且docker運(yùn)用聯(lián)合加載技術(shù)又會(huì)在root文件系統(tǒng)之上加載更多的只讀文件系統(tǒng),聯(lián)合加載指的是一次加載多個(gè)文件系統(tǒng),但是在外面看起來只能看到一個(gè)文件系統(tǒng),聯(lián)合加載會(huì)將各層文件系統(tǒng)疊加到一起,這樣最終的文件系統(tǒng)會(huì)包含所有的底層文件和目錄,docker將這樣的文件系統(tǒng)稱為鏡像。
容器通過鏡像來啟動(dòng),Docker的容器是Docker的執(zhí)行來源,容器中可以運(yùn)行客戶的一個(gè)或多個(gè)進(jìn)程,如果說鏡像是Docker聲明周期中的構(gòu)建和打包階段,那么容器則是啟動(dòng)和執(zhí)行階段。
當(dāng)一個(gè)容器啟動(dòng)時(shí),docker會(huì)在該鏡像的最頂層加載一個(gè)讀寫文件系統(tǒng),也就是一個(gè)可寫的文件層,我們?cè)赿ocker運(yùn)行的程序,就是在這個(gè)層中進(jìn)行執(zhí)行的,當(dāng)docker第一次啟動(dòng)一個(gè)容器時(shí),初始的讀寫層是空的,當(dāng)文件系統(tǒng)發(fā)生變化時(shí),這些變化都會(huì)應(yīng)用到這一層上,比如像修改一個(gè)文件,該文件首先會(huì)從讀寫層下面的只讀層復(fù)制到該讀寫層,該文件的只讀版本依然存在,但是已經(jīng)被讀寫層中的該文件副本所隱藏,這就是docker的一個(gè)重要技術(shù):寫時(shí)復(fù)制(copy on write)。每個(gè)只讀鏡像層都是只讀的,永遠(yuǎn)不會(huì)變化,當(dāng)創(chuàng)建一個(gè)新容器時(shí),docker會(huì)構(gòu)建出一個(gè)鏡像棧,如下圖所示:
docker用倉庫來保存用戶構(gòu)建的鏡像,倉庫分為公有和私有兩種,Docker公司提供了一個(gè)公有的倉庫Docker Hub。
Docker依賴于Linux內(nèi)核的兩個(gè)重要特性:
Namespaces 命名空間
Control groups (cgroups) 控制組
很多編程語言都包含了“命名空間”的概念,我們可以認(rèn)為“命名空間”是一種“封裝”的概念, 而“封裝”本身實(shí)際上實(shí)現(xiàn)的是代碼的隔離。而在操作系統(tǒng)中,命名空間提供的是系統(tǒng)資源的隔離,而系統(tǒng)資源包括了進(jìn)程、網(wǎng)絡(luò)、文件系統(tǒng)等。
我們從Docker公開的文檔來看,它使用了5種命名空間:
PID(Process ID) 進(jìn)程隔離
NET(Network)管理網(wǎng)絡(luò)接口
IPC(InterProcess Communication)管理跨進(jìn)程通信的訪問
MNT(Mount)管理掛載點(diǎn)
UTS(Unix Timesharing System) 隔離內(nèi)核和版本標(biāo)識(shí)
那么,這些隔離的資源,是如何被管理起來的呢?這就需要用到——Control groups(cgroup)控制組了。
Control groups是Linux內(nèi)核提供的,一種可以限制、記錄、隔離進(jìn)程組所使用的物理資源的機(jī)制。 最初是由google工程師提出,并且在2007年時(shí)被Linux的內(nèi)核的2.6.24版本引進(jìn)??梢哉f,Control groups就是為容器而生的,沒有Control groups就沒有容器技術(shù)的今天。
Control groups提供了以下功能:
資源限制:例如,memory(內(nèi)存)子系統(tǒng)可以為進(jìn)程組設(shè)定一個(gè)內(nèi)存使用的上限,一旦進(jìn)程組使用的內(nèi)存達(dá)到了限額,該進(jìn)程組再發(fā)出內(nèi)存申請(qǐng)時(shí),就會(huì)發(fā)出“out of memory”(內(nèi)存溢出)的警告。
優(yōu)先級(jí)設(shè)定:它可以設(shè)定哪些進(jìn)程組可以使用更大的CPU或者磁盤IO的資源。
資源計(jì)量:它可以計(jì)算進(jìn)程組使用了多少系統(tǒng)資源。尤其是在計(jì)費(fèi)系統(tǒng)中,這一點(diǎn)十分重要。
資源控制:它可以將進(jìn)程組掛起或恢復(fù)。
到這里我們了解了Namespace和CGroup的概念和職能,而這兩個(gè)特性帶給了Docker哪些能力呢?如下:
文件系統(tǒng)隔離:首先是文件系統(tǒng)的隔離,每個(gè)Docker的容器,都可以擁有自己的root文件系統(tǒng)。
進(jìn)程隔離:每個(gè)容器都運(yùn)行在自己的進(jìn)程環(huán)境中。
網(wǎng)絡(luò)隔離:容器間的虛擬網(wǎng)絡(luò)接口和IP地址都是分開的。
資源的隔離和分組:使用cgroups將cpu和內(nèi)存之類的資源獨(dú)立分配給每個(gè)Docker容器。
關(guān)于“Docker基本概念和框架的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。