作者:李文君 評閱人:鹿凱翔、黃春超
1. Docker簡介
這里引用Maureen O'Gara給Docker下的定義:“Docker是一個開發(fā)源代碼的軟件項(xiàng)目,讓應(yīng)用程序部署在軟件容器下的工作可以自動化進(jìn)行,借此在Linux操作系統(tǒng)上,提供一個額外的軟件抽象層,以及操作系統(tǒng)層虛擬化的自動管理機(jī)制。"
提到Docker技術(shù)必須先解釋一下什么是Container(容器)。Container就是標(biāo)準(zhǔn)化的軟件單元,它將代碼以及代碼所依賴的運(yùn)行環(huán)境打包,就可以很輕松的移植到任何一個平臺下去運(yùn)行,而在截至寫這篇文章之前Docker已經(jīng)支持在Windows Server平臺下運(yùn)行。正因如此,Docker技術(shù)以其標(biāo)準(zhǔn)化、輕量級、安全的特點(diǎn),已成為目前世界主流的企業(yè)級容器技術(shù)?!?br>
訪問Docker的官網(wǎng)你會發(fā)現(xiàn)這樣一個圖標(biāo):
這個圖形象的說明了我們的Docker就是這個搬運(yùn)工,而我們搬運(yùn)的正是鯨魚背上的Container。

2. Container與Virtual Machines比較
Docker被提出之后,很多人簡單的以傳統(tǒng)的虛擬機(jī)技術(shù)進(jìn)行類比,其實(shí)二者有共同之處,二者都可對外提供一個虛擬化的平臺資源,都能提供資源隔離和分配,但功能卻不盡不同,因?yàn)槿萜魈摂M化的只是操作系統(tǒng)而非硬件,所以容器技術(shù)更輕量,更高效。我們可以以下面兩幅圖進(jìn)行比較:

Virtual Machines:
虛擬機(jī)(VM)是物理硬件的抽象,將一臺服務(wù)器轉(zhuǎn)變?yōu)槎嗯_服務(wù)器。虛擬機(jī)管理程序允許多臺虛擬機(jī)在一臺計(jì)算機(jī)上運(yùn)行。每個VM都包含操作系統(tǒng)的完整副本、應(yīng)用程序、必要的二進(jìn)制文件和庫 - 通常占用數(shù)十GB,虛擬機(jī)啟動和運(yùn)行都很慢。
Container:
容器是應(yīng)用層的抽象,它將代碼和依賴關(guān)系打包在一起。多個容器可以在同一臺機(jī)器上運(yùn)行,并與其他容器共享操作系統(tǒng)內(nèi)核,每個容器在用戶空間中作為獨(dú)立進(jìn)程運(yùn)行。容器占用的空間比VM少(容器映像的大小通常為幾十MB),可以處理更多的應(yīng)用程序,并且需要更少的VM和操作系統(tǒng)。
3. Docker相關(guān)的知識
-
Docker Imgae
Docker的鏡像可以解釋為一個只讀的模板,一個獨(dú)立的文件系統(tǒng),其上包括運(yùn)行容器所需的數(shù)據(jù)。如果用戶想要自定義一個完整的鏡像系統(tǒng),就需要將我們所需的鏡像一層一層的進(jìn)行疊加,比如:你要自定義一個WEB開發(fā)的環(huán)境鏡像,你需要首先加入一層JDK的鏡像,之后可以再添加MYSQL、TOMCAT等服務(wù)的鏡像。 -
DockerFile
另一種構(gòu)建鏡像的方式就是基于Dockerfile構(gòu)建,Dockerfile是一個描述文件,里面包含若干條命令,就如同我們在LINUX系統(tǒng)下使用SHELL腳本自動化的安裝運(yùn)行環(huán)境一樣。只要我們按照既定的規(guī)則編寫命令,就可以輕易的實(shí)現(xiàn)自動化安裝。 -
Docker Hub
看完上面的介紹,你一定想知道Docker 鏡像是從哪里來的?其實(shí)Docker早已經(jīng)給我們準(zhǔn)備一個Docker倉庫--Docker Hub,這里可以類比于我們所熟悉的Git Hub,Docker Hub是一個開源的鏡像托管的倉庫,所有注冊用戶都可以免費(fèi)獲取倉庫中的鏡像文件,只需要簡單的PULL、PUSH命令就可以實(shí)現(xiàn)拉取或者提交鏡像文件。 -
Docker Volume
在介紹Docker Volume之前,我們需要先知道Docker的文件系統(tǒng)是如何工作的。由于Docker鏡像是由多個文件系統(tǒng)(只讀層)疊加而成(如下圖),當(dāng)我們啟動一個容器的時候,Docker會加載只讀鏡像層并在其上添加一個讀寫層,如果運(yùn)行過程中需要修改容器中的某個文件,那該文件將會從只讀層復(fù)制到讀寫層,我們修改的只是這個讀寫層的文件,而該文件的只讀版本仍然存在,這就是我們常說的寫時復(fù)制。當(dāng)然這樣做的缺點(diǎn)是當(dāng)我們刪除Docker容器,并通過該鏡像重新啟動時,之前的更改將會丟失。
copy-on-write
為了能夠?qū)崿F(xiàn)數(shù)據(jù)持久化以及共享容器間的數(shù)據(jù),Docker Volume的概念被提出。Volume就是目錄或者文件,我們可以通過將宿主機(jī)上的某個文件或目錄掛在到容器內(nèi)的某個文件或目錄下,這樣在容器內(nèi)產(chǎn)生或者修改的數(shù)據(jù)都會自動的同步到外部主機(jī)對應(yīng)目錄下,以實(shí)現(xiàn)數(shù)據(jù)持久化,如果多個容器內(nèi)的目錄掛載到同一個目錄下就可以實(shí)現(xiàn)數(shù)據(jù)共享。
