一蔬充、Docker簡介
Docker是一個(gè)開源的應(yīng)用容器引擎,基于 GO語言并遵從Apache2.0協(xié)議開源班利。Docker可以讓開發(fā)者打包他們的應(yīng)用以及依賴包到一個(gè)輕量級饥漫、可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上罗标,可以實(shí)現(xiàn)虛擬化庸队。
Docker所代表的容器虛擬化技術(shù)屬于操作系統(tǒng)級虛擬化:內(nèi)核通過創(chuàng)建多個(gè)虛擬的操作系統(tǒng)實(shí)例(內(nèi)核和庫)來隔離不同的進(jìn)程。并且傳統(tǒng)虛擬化技術(shù)是在硬件層面實(shí)現(xiàn)虛擬化闯割,增加了系統(tǒng)調(diào)用鏈路的環(huán)節(jié)彻消,有性能損耗;容器虛擬化技術(shù)以共享Kernel的方式實(shí)現(xiàn)宙拉,幾乎沒有性能損耗宾尚。這里可以將容器理解為一種沙盒。每個(gè)容器內(nèi)運(yùn)行一個(gè)應(yīng)用谢澈,不同的容器相互隔離煌贴,容器之間可以建立通信機(jī)制。容器的創(chuàng)建和停止都十分快速(秒級)澳化,容器自身對資源的需求十分有限崔步,遠(yuǎn)比虛擬機(jī)本身占用的資源少。
1-1缎谷、Docker和虛擬化的對比
虛擬化:
Docker:
Docker的優(yōu)勢在于可以直接使用主機(jī)操作系統(tǒng)的資源進(jìn)行虛擬化井濒,對主機(jī)資源的利用率比較高灶似。并且借助Docker和云計(jì)算技術(shù)可以簡化程序,實(shí)現(xiàn)快速部署瑞你,彈性使用資源等酪惭。
1-2、Docker架構(gòu)
Docker架構(gòu)如下圖:
相關(guān)概念:
Docker Daemon(Docker進(jìn)程):Docker進(jìn)程是部署在linux操作系統(tǒng)上者甲,負(fù)責(zé)支撐Docker Container的運(yùn)行以及本地Image的管理春感。
Docker Client:用戶不直接操作Docker daemon,用戶通過Docker Client訪問Docker虏缸,Docker Client提供pull鲫懒、run等操作命令。
Docker Image:Docker鏡像就是一個(gè)只讀的模板刽辙。例如:一個(gè)鏡像可以包含一個(gè)完整的 ubuntu 操作系統(tǒng)環(huán)境窥岩,里面僅安裝了 Apache 或用戶需要的其它應(yīng)用程序。
鏡像可以用來創(chuàng)建 Docker 容器宰缤。Docker 提供了一個(gè)很簡單的機(jī)制來創(chuàng)建鏡像或者更新現(xiàn)有的鏡像颂翼,用戶甚至可以直接從其他人那里下載一個(gè)已經(jīng)做好的鏡像來直接使用。Docker Container:Docker 利用容器來運(yùn)行應(yīng)用慨灭。容器是從鏡像創(chuàng)建的運(yùn)行實(shí)例朦乏。它可以被啟動、開始氧骤、停止呻疹、刪除。每個(gè)容器都是相互隔離的筹陵、保證安全的平臺诲宇。可以把容器看做是一個(gè)簡易版的 Linux環(huán)境(包括root用戶權(quán)限惶翻、進(jìn)程空間、用戶空間和網(wǎng)絡(luò)空間等)和運(yùn)行在其中的應(yīng)用程序鹅心。
Docker Registry:倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式
最大的公開倉庫是 Docker Hub吕粗,存放了數(shù)量龐大的鏡像供用戶下載。用戶也可以在本地網(wǎng)絡(luò)內(nèi)創(chuàng)建一個(gè)私有倉庫旭愧。當(dāng)用戶創(chuàng)建了自己的鏡像之后就可以使用 push 命令將它上傳到公有或者私有倉庫颅筋,這樣下次在另外一臺機(jī)器上使用這個(gè)鏡像時(shí)候,只需要從倉庫上 pull 下來就可以了输枯。
Docker使用客戶端-服務(wù)器 (C/S) 架構(gòu)模式议泵,使用遠(yuǎn)程API來管理和創(chuàng)建Docker容器。Docker容器通過Docker鏡像來創(chuàng)建桃熄,這里容器與鏡像的關(guān)系類似于面向?qū)ο缶幊讨械膶ο笈c類的關(guān)系先口。
Docker簡單架構(gòu)圖如下:
二、Docker核心概念:鏡像
2-1、docker鏡像底層原理
bootFS(boot file system)主要包括bootloader和kernel碉京,bootloader主要是引導(dǎo)加載kernel厢汹,內(nèi)核加載進(jìn)內(nèi)存后,系統(tǒng)會卸載bootFS節(jié)省內(nèi)存谐宙。
-
rootFS(root file system)烫葬,位于bootFS之上,包含的是例如典型Linux中的/dev凡蜻,/proc搭综、/bin、/etc等標(biāo)準(zhǔn)目錄和文件划栓。
- 在傳統(tǒng)模式中兑巾,系統(tǒng)啟動內(nèi)核掛載rootFS時(shí)會先將其掛載為只讀模式,等系統(tǒng)完成自檢后將其掛載為讀寫模式茅姜。
- 但是在docker中闪朱,內(nèi)核掛載rootFS時(shí)只會將其掛載為只讀模式,而后通過UnionFS技術(shù)再掛載一個(gè)可寫層钻洒。
對于一個(gè)精簡的OS奋姿,rootFS可以很小,只需包括最基本的命令素标、工具和程序庫即可称诗,然后直接使用宿主機(jī)的內(nèi)核,自己只需提供rootFS即可头遭。rootFS就是各種不同系統(tǒng)的發(fā)行版寓免,例如CentOS、Ubuntu等等计维。對于不同的Linux發(fā)行版袜香,bootFS基本是一致的,可以公用的鲫惶,rootFS會有差別蜈首。
聯(lián)合文件系統(tǒng)(UnionFS)是一種分層、輕量級并且高性能的文件系統(tǒng)欠母,可以將對文件系統(tǒng)的修改作為一次提交來一層一層的疊加欢策,并且可以將不同目錄掛載到同一虛擬文件系統(tǒng)下面。這樣一次同時(shí)加載多個(gè)文件系統(tǒng)赏淌,同時(shí)聯(lián)合加載機(jī)制會將各種文件系統(tǒng)疊加起來踩寇,這樣最終的文件系統(tǒng)會包括所有底層的文件和目錄。
2-2六水、docker鏡像加載原理
鏡像的基礎(chǔ)就是UnionFS俺孙。鏡像可以通過分層來進(jìn)行繼承辣卒,基于基礎(chǔ)鏡像,可以制作各種具體的應(yīng)用鏡像鼠冕。鏡像其實(shí)就是一堆只讀層(read-only layer)的統(tǒng)一視角添寺,如圖所示:
從左邊我們看到了多個(gè)只讀層,它們重疊在一起懈费。除了最下面一層计露,其它層都會有一個(gè)指針指向下一層。這些層是Docker內(nèi)部的實(shí)現(xiàn)細(xì)節(jié)憎乙,并且能夠在Docker宿主機(jī)的文件系統(tǒng)上訪問到票罐。UnionFS技術(shù)能夠?qū)⒉煌膶诱铣梢粋€(gè)文件系統(tǒng),為這些層提供了一個(gè)統(tǒng)一的視角泞边,這樣就隱藏了多層的存在该押,在用戶的角度看來,只存在一個(gè)文件系統(tǒng)阵谚。我們可以在圖片的右邊看到這個(gè)視角的形式蚕礼。
2-3、docker鏡像使用分層結(jié)構(gòu)的好處
鏡像采用分層結(jié)構(gòu)梢什,最大的好處就是可以共享資源奠蹬,例如多個(gè)鏡像都從相同的base鏡像構(gòu)建而來,那么宿主機(jī)的磁盤和內(nèi)存中嗡午,也只需加載一份base鏡像就可以為所有的容器服務(wù)囤躁,鏡像的每一層都是共享的。
三荔睹、Docker核心概念:容器
容器是從鏡像創(chuàng)建的應(yīng)用運(yùn)行實(shí)例狸演,容器之間是相互隔離、互不可見的僻他∠啵可以把容器看做一個(gè)簡易版的linux系統(tǒng)環(huán)境(包括root權(quán)限、進(jìn)程空間吨拗、用戶空間和網(wǎng)絡(luò)空間等)消玄,以及運(yùn)行在這個(gè)環(huán)境上的應(yīng)用打包而成的應(yīng)用盒子。鏡像自身是自讀的丢胚,容器從鏡像啟動的時(shí)候,docker會在鏡像的最上層創(chuàng)建一個(gè)可寫文件層受扳,鏡像本身保持不變携龟。
容器(container)的定義和鏡像(image)幾乎一模一樣,也是一堆層的統(tǒng)一視角勘高,唯一區(qū)別在于容器的最上面那一層是可讀可寫的峡蟋》匚Γ可以這樣理解,容器 = 鏡像 + 讀寫層蕊蝗。
一個(gè)運(yùn)行態(tài)容器(running container)被定義為一個(gè)可讀寫的統(tǒng)一文件系統(tǒng)加上隔離的進(jìn)程空間和包含其中的進(jìn)程仅乓。下面這張圖片展示了一個(gè)運(yùn)行中的容器。
一個(gè)容器中的進(jìn)程可能會對文件進(jìn)行修改蓬戚、刪除夸楣、創(chuàng)建,這些改變都將作用于可讀寫層(read-write layer)子漩。下面這張圖展示了這個(gè)行為豫喧。
四、Docker核心概念:倉庫
Docker倉庫(Repository)類似與代碼倉庫幢泼,是Docker集中存放鏡像文件的場所紧显。
有時(shí)候會看到有資料將Docker倉庫和注冊服務(wù)器(Registry)混為一談,并不嚴(yán)格區(qū)分缕棵。實(shí)際上孵班,注冊服務(wù)器是存放倉庫的地方,其上往往存放著多個(gè)倉庫招驴。每個(gè)倉庫集中存放某一類鏡像篙程,往往包括多個(gè)鏡像文件,通過不同的標(biāo)簽(tag)來進(jìn)行區(qū)分忽匈。例如存放Ubuntu操作系統(tǒng)鏡像的倉庫房午,稱為Ubuntu倉庫,其中可能包括14.04,12.04等不同版本的鏡像丹允。
根據(jù)存儲的鏡像公開分享與否郭厌,Docker倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。目前雕蔽,最大的公開倉庫是Docker Hub 折柠,存放了數(shù)量龐大的鏡像供用戶下載。國內(nèi)的阿里云既提供了加速功能批狐,也提供了倉庫功能扇售,也就是我們可以將自己的鏡像上傳到阿里云倉庫。如果用戶不希望公開分享自己的鏡像文件嚣艇,Docker也支持用戶在本地網(wǎng)絡(luò)內(nèi)創(chuàng)建一個(gè)只能自己訪問的私有倉庫承冰。
當(dāng)用戶創(chuàng)建了自己的鏡像之后就可以使用push將它上傳到指定的公有或則私有倉庫。這樣用戶下次在另一臺機(jī)器上使用該鏡像時(shí)食零,只需將其從倉庫pull下來就可以了困乒。