docker分層映象機制:docker映象是分層建立的,DockerFile中每一條指令都會新建一層。

接下來一起來透過實踐來探究一下docker映象層在docker host主機中的儲存。

首先做一些基礎性的工作:

建立兩個檔案

echo content is aa>>aa。txt

echo content is bb>>bb。txt

例如下的DockerFile

FROM centos

COPY aa。txt /

COPY bb。txt /

基於上面建立的DockerFile檔案構建映象

docker build -t image_1 。

最後一個

.

是上下文路徑,也就是DockerFile所在的上下文路徑,

上下文路徑

,是指 docker 在構建映象,有時候想要使用到本機的檔案(比如複製),docker build 命令得知這個路徑後,會將路徑下的所有內容打包。

解析

:由於 docker 的執行模式是 C/S。我們本機是 C,docker 引擎是 S。實際的構建過程是在 docker 引擎下完成的,所以這個時候無法用到我們本機的檔案。這就需要把我們本機的指定目錄下的檔案一起打包提供給 docker 引擎使用。

如果未說明最後一個引數,那麼預設上下文路徑就是 Dockerfile 所在的位置。

注意

:上下文路徑下不要放無用的檔案,因為會一起打包傳送給 docker 引擎,

如果檔案過多會造成過程緩慢。

建立好後,檢視一下映象

docker images

docker學習筆記——映象分層(實戰)

發現我們剛才建立了兩個映象,一個是centos, 這裡的centos 就是定製需要的基礎映象,另一個是image_1

docker history :

檢視指定映象的建立歷史。

docker history centos

docker history image_1

docker學習筆記——映象分層(實戰)

image_1映象和centos映象的差別:

image_1映象是基於centos映象的基礎上,又添加了兩個映象層,這兩個映象層正好是我們Dockerfile的如下兩條指令生成的。

COPY aa。txt /

COPY bb。txt /

接下來我們來看看,這些生成的映象層在docker host主機的位置,預設生成的映象層儲存位置為/var/lib/docker/${storege driver}。

注意:這邊如果你用的是mac,如果你發現/var/lib/docke不存在,請看這篇文章

檢視docker儲存驅動(storege driver)可以透過如下命令docker info

docker info

docker學習筆記——映象分層(實戰)

檢視docker詳細資訊

由於我mac上storege driver是overlay2,所以去/var/lib/docker/overlay2裡面檢視,進入/var/lib/docker/overlay2目錄

cd /var/lib/docker/overlay2

ls -lt

docker學習筆記——映象分層(實戰)

從目錄中檢視(按時間逆序排序),包含三個資料夾(l那個忽略),這三個資料夾對應儲存了三個映象層的內容,其中兩個是COPY指令生成的映象層,一個是centos基礎映象層。

首先猜一下,第一個以18開頭的資料夾存放的對應的是哪一層呢,如果你猜的是(

COPY bb。txt /

)這條指令生成的映象層,那恭喜你才對了。

因為Dockerfile檔案中的指令是按順序一條一條執行的,由於(

COPY bb。txt /

)這條指令是DockerFile中最後的一條指令,所以相應最後生成的資料夾(以18開頭的資料夾)應該對應儲存的是(

COPY bb。txt /

)這條指令生成的映象層,

再次強調一下我那個目錄展示按時間逆序排的

,親愛的朋友,不知道你明白了沒有,好了,來一起實踐探個究竟,命令如下

cd 18ba26e119b244a07f06be9fc5f0635dd228f3d6404247fdfeea8a75eedeae09/

cd diff

ls

docker學習筆記——映象分層(實戰)

docker host映象層目錄內容

這個diff目錄存放就是我們建立映象時的內容,即bb。txt, 同理我們可以推出另外兩個資料夾目錄分別儲存的是對應以上兩條指令生成的映象層內容。

FROM centos

COPY aa。txt /

好的,寫完了,如果有疑問的話,請私信或者留言。

大家好,我是尋夢,在追夢路上保持初心,一直向前。

如果這篇文章感覺還可以的話,收藏的同時麻煩點贊或者關注一下,共同學習!