不少剛剛接觸容器技術的朋友,不容易弄清楚容器,容器鏡像和Docker這幾個詞的區別和聯繫。nginx
咱們首先來看容器和容器鏡像。舉個例子,執行命令行docker search nginx,搜索結果的一條條記錄就是一個個容器鏡像。web
所謂鏡像,就是一個靜態概念,一個鏡像由若干只讀層(read-only layer)構成。docker
上圖左邊是Docker鏡像的內部實現細節,咱們能看到多個只讀層疊加在一塊兒,層與層之間經過指針關聯,這些層可以在運行Docker的宿主機的文件系統上訪問到。ubuntu
Linux的統一文件系統(union file system)技術將這些疊加的只讀層合併成一個文件系統,該系統爲這些只讀層提供了一個統一的視角,從而爲Docker的用戶隱藏了多層的存在。網絡
從Docker用戶的視角出發,一個Docker鏡像只存在一個文件系統,即上圖右邊所示。spa
這些文件系統的設計是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的原創文章,請關注公衆號"汪子熙":