
Docker是一個(gè)開源項(xiàng)目誕生于2013年初,最初是dotCloud公司內(nèi)部的一個(gè)業(yè)余項(xiàng)目,基于Google公司的Go語(yǔ)言實(shí)現(xiàn),項(xiàng)目后來(lái)加入Linux基金會(huì),遵從Apache2.0協(xié)議,項(xiàng)目代碼在Github上維護(hù)。
Docker的目標(biāo)是實(shí)現(xiàn)輕量級(jí)的操作系統(tǒng)虛擬化解決方案,Docker的基礎(chǔ)是Linux容器LXC等技術(shù),在LXC基礎(chǔ)上Docker做了進(jìn)一步的封裝,讓用戶不需要關(guān)心容器的管理,使得操作更為簡(jiǎn)便。用戶操作Docker容器就像操作一個(gè)快速輕量級(jí)的虛擬機(jī)一樣簡(jiǎn)單。
什么是虛擬機(jī)呢?
虛擬機(jī)本質(zhì)上是對(duì)現(xiàn)實(shí)計(jì)算機(jī)的仿真,它會(huì)像真機(jī)一樣執(zhí)行程序。使用虛擬機(jī)管理程序hypervisor可以將虛擬機(jī)運(yùn)行在物理機(jī)上,也可以運(yùn)行在裸機(jī)上。虛擬機(jī)管理程序本身在物理機(jī)(主機(jī))上運(yùn)行,主機(jī)為虛擬機(jī)提供資源,包括RAM和CPU。這些資源在虛擬機(jī)之間被劃分并根據(jù)需要進(jìn)行分配。如果一個(gè)虛擬機(jī)上運(yùn)行了資源占用很大的應(yīng)用程序,你可以相應(yīng)地為它分配更多的系統(tǒng)資源。

什么是虛擬機(jī)管理程序hypervisor?
由于虛擬機(jī)擁有自己的虛擬操作系統(tǒng),管理程序?yàn)樘摂M機(jī)管理和執(zhí)行訪問操作系統(tǒng)提供了一個(gè)平臺(tái),它允許主機(jī)與作為客戶端運(yùn)行的虛擬機(jī)之間共享其資源。

什么是容器呢?
容器是通過抽象用戶空間來(lái)提供操作系統(tǒng)級(jí)別的虛擬化,容器看起來(lái)像是一個(gè)虛擬機(jī)。它們有執(zhí)行進(jìn)程的私有空間,有專用的網(wǎng)絡(luò)接口和IP地址,同樣也可以掛載文件系統(tǒng)...
容器和虛擬機(jī)之間的一個(gè)重要的區(qū)別在于:容器和其它容器是共享主機(jī)系統(tǒng)的內(nèi)核的。

Docker與傳統(tǒng)虛擬化方式(虛擬機(jī),VM)有什么不同之處呢?

-
傳統(tǒng)虛擬機(jī)是在硬件層面實(shí)現(xiàn)虛擬化
傳統(tǒng)虛擬化
虛擬機(jī)VM是一個(gè)運(yùn)行在宿主機(jī)之上的完整的操作系統(tǒng),虛擬機(jī)運(yùn)行自身操作系統(tǒng)時(shí)會(huì)占用較多的系統(tǒng)資源。
系統(tǒng)虛擬化 -
Docker是在操作系統(tǒng)層面上實(shí)現(xiàn)虛擬化
Docker虛擬化
Docker與VM不同的是,只包含應(yīng)用程序與依賴庫(kù),基于libcontainer運(yùn)行在宿主機(jī)上,并處于一個(gè)隔離的環(huán)境中,使得Docker更加輕量且高效。

Docker引擎是什么呢?
Docker引擎是一個(gè)C/S結(jié)構(gòu)的應(yīng)用,由三部分構(gòu)成:
- Server
服務(wù)器docker daemon是一個(gè)常駐進(jìn)程 - REST API
實(shí)現(xiàn)客戶端與服務(wù)器之間的交互協(xié)議 -
CLI
客戶端docker CLI命令行工具實(shí)現(xiàn)容器和鏡像的管理為用戶提供統(tǒng)一的操作界面
Docker引擎
Docker的架構(gòu)是什么樣的呢?
Docker使用C/S架構(gòu),客戶端通過接口與服務(wù)器進(jìn)程通信以實(shí)現(xiàn)容器的構(gòu)建、運(yùn)行和發(fā)布。
-
Docker daemon
Docker守護(hù)進(jìn)程運(yùn)行在宿主機(jī)上,用戶通過Docker客戶端(docker cli)與之交互。
Docker后臺(tái)守護(hù)進(jìn)程 -
Docker client
Docker客戶端是一個(gè)命令行工具(CLI),是用戶使用Docker的主要方式。Docker客戶端與Docker服務(wù)器守護(hù)進(jìn)程通信并將結(jié)果返回給用戶,Docker客戶端也可以通過socker或RESTful API訪問遠(yuǎn)程的Docker daemon。
Docker的C/S架構(gòu)
Docker客戶端和服務(wù)器可以運(yùn)行在同一臺(tái)集群,也可以通過跨主機(jī)實(shí)現(xiàn)遠(yuǎn)程通信。

Docker的核心是什么呢?

- 鏡像
image
Docker鏡像是一個(gè)只讀的模板,是一堆只讀層(read-only layer)的統(tǒng)一視角。鏡像可以用來(lái)創(chuàng)建Docker容器,一個(gè)鏡像可以創(chuàng)建多個(gè)容器。Docker提供了一個(gè)簡(jiǎn)單的機(jī)制來(lái)創(chuàng)建鏡像或更新鏡像,用戶甚至可以直接從其他人哪里下載一個(gè)已經(jīng)做好的鏡像來(lái)直接使用。
鏡像
鏡像是容器的基石,鏡像保存了啟動(dòng)容器的條件,容器基于鏡像的啟動(dòng)而運(yùn)行。Docker鏡像是一個(gè)層疊的只讀文件系統(tǒng),最底端是一個(gè)引導(dǎo)文件系統(tǒng)和bootfs。用戶永遠(yuǎn)不會(huì)和引導(dǎo)文件系統(tǒng)有交互,實(shí)際上當(dāng)容器啟動(dòng)后,bootfs會(huì)被移到內(nèi)存中,而引導(dǎo)文件將被卸載。

Docker鏡像的第二層是root文件系統(tǒng)rootfs,位于引導(dǎo)文件系統(tǒng)之上,可以有多種操作系統(tǒng)。
- 倉(cāng)庫(kù)
repository
倉(cāng)庫(kù)是集中存放鏡像的場(chǎng)所,倉(cāng)庫(kù)分為公開倉(cāng)庫(kù)(public)和私有倉(cāng)庫(kù)(private)兩種形式,最大的公開倉(cāng)庫(kù)是Docker Hub,存放龐大的鏡像供用戶下載。用戶可以在本地網(wǎng)絡(luò)內(nèi)創(chuàng)建一個(gè)私有倉(cāng)庫(kù),但用戶創(chuàng)建了自己的鏡像后可使用push命令將他上傳到公有或私有倉(cāng)庫(kù)。下載在另外一臺(tái)機(jī)器上使用時(shí)只需要從倉(cāng)庫(kù)中pull下來(lái)即可。Docker的倉(cāng)庫(kù)跟Git類似,注冊(cè)服務(wù)器可理解為GitHub這樣的托管服務(wù)器。實(shí)際上,倉(cāng)庫(kù)注冊(cè)服務(wù)器(registry)上存放著多個(gè)倉(cāng)庫(kù),每個(gè)倉(cāng)庫(kù)又包含多個(gè)鏡像,每個(gè)鏡像有著不同的標(biāo)簽(tag)。
倉(cāng)庫(kù)

- 容器
container
Docker利用容器來(lái)運(yùn)行應(yīng)用,容器是從鏡像中創(chuàng)建的運(yùn)行實(shí)例。每個(gè)容器都是相互隔離的,以保證平臺(tái)的安全。容器的定義和鏡像的定義一樣,也是一堆層的統(tǒng)一視角,唯一的區(qū)別在于容器的最上層是可讀寫的。
一個(gè)運(yùn)行態(tài)的容器被定義為一個(gè)可讀寫的“統(tǒng)一文件系統(tǒng)+隔離的進(jìn)程空間+包含其中的進(jìn)程”。
一個(gè)運(yùn)行態(tài)容器
正是文件系統(tǒng)隔離技術(shù)使得Docker成為一個(gè)非常具有潛力的虛擬化技術(shù),一個(gè)容器中的進(jìn)程可能會(huì)對(duì)文件進(jìn)行修改、刪除、創(chuàng)建等操作,這些改變都將作用于可讀寫層。








