容器和容器映象的區別,您真的瞭解嗎

i042416發表於2018-12-21

很多剛剛接觸容器技術的朋友,不容易弄清楚容器,容器映象和Docker這幾個詞的區別和聯絡。

容器和容器映象的區別,您真的瞭解嗎

我們首先來看容器和容器映象。舉個例子,執行命令列docker search nginx,搜尋結果的一條條記錄就是一個個容器映象。

容器和容器映象的區別,您真的瞭解嗎

所謂映象,就是一個靜態概念,一個映象由若干只讀層(read-only layer)構成。

容器和容器映象的區別,您真的瞭解嗎

上圖左邊是Docker映象的內部實現細節,我們能看到多個只讀層疊加在一起,層與層之間通過指標關聯,這些層能夠在執行Docker的宿主機的檔案系統上訪問到。

Linux的統一檔案系統(union file system)技術將這些疊加的只讀層合併成一個檔案系統,該系統為這些只讀層提供了一個統一的視角,從而為Docker的使用者隱藏了多層的存在。

從Docker使用者的視角出發,一個Docker映象只存在一個檔案系統,即上圖右邊所示。

這些檔案系統的設計是Docker實現細節,一般情況下我們不用去深究。但如果您足夠好奇,使用命令sudo tree瀏覽目錄 /var/lib/docker即可:

容器和容器映象的區別,您真的瞭解嗎

比如我用命令docker images瀏覽下載到本地的docker映象:

容器和容器映象的區別,您真的瞭解嗎

其中一個叫jerry-nginx的映象,是一個web應用,它的所有內容能在/var/lib/docker目錄下的這個目錄查到:

容器和容器映象的區別,您真的瞭解嗎

講完了容器映象,我們再來看容器。

容器和容器映象的區別,您真的瞭解嗎

容器和容器映象一樣,也是若干層的疊加,唯一區別是所有隻讀層的最上面一層,是一層可讀可寫層,如上圖綠色圖例所示。

初學者可以記住這個簡單的公式:容器 = 容器映象 + 可讀可寫層

容器和容器映象的區別,您真的瞭解嗎

我們如果用命令docker ps --all檢視本機所有容器列表,會發現有的容器處於執行狀態,有的處於退出狀態。

因此,一個處於執行狀態的容器(running container)包含一個可讀寫的檔案系統加上隔離的程式空間。

容器裡的程式可以對這個可讀寫檔案系統內的檔案進行修改、刪除、建立等操作。

映象裡每一層其實都能在docker資料夾的containers子目錄下找到:

容器和容器映象的區別,您真的瞭解嗎

上圖每一個紅色資料夾代表映象裡的一層,藍色檔案包含了該層執行時的日誌檔案,或者網路相關配置等。

做個實驗:

容器和容器映象的區別,您真的瞭解嗎

ubuntu這個容器執行結束後,使用find / -name i042416.txt檔案,這說明docker執行時能對宿主機的檔案系統進行寫操作。

容器和容器映象的區別,您真的瞭解嗎

下面分析幾個常用的易混淆的命令。

docker create <image-id>

先看它的幫助文件:

容器和容器映象的區別,您真的瞭解嗎

試著執行以下:

容器和容器映象的區別,您真的瞭解嗎

產生一個輸出id:

7ee10851c3f1e53bbd35e5f196f34de560afa1a20d9bf1ced587630dbcda877b

create建立的容器,狀態變為created:

容器和容器映象的區別,您真的瞭解嗎

docker create命令給通過命令列傳入的容器映象建立了一個新的可讀可寫層,從而生成了一個新的容器例項:

容器和容器映象的區別,您真的瞭解嗎

然後再執行docker start,輸入docker create建立的容器例項ID,就可以啟動這個容器例項了。

而docker run其實就是docker create和docker start這兩個命令合二為一的版本。

希望這篇文章能幫助大家理解容器和容器映象的區別。
要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":

容器和容器映象的區別,您真的瞭解嗎


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2286052/,如需轉載,請註明出處,否則將追究法律責任。

相關文章