docker的鏡像分層
docker里的鏡像絕大部分都是在別的鏡像的基礎上去進行創建的,也就是使用鏡像的分層結構。
實驗
比如說使用dockerfile去創建一個最簡單的hello鏡像。創建好對應的dockerfile之后去進行創建:
FROM alpine:latest
MAINTAINER sbb
CMD echo "hello world"
執行了上面的命令我們可以看到存在着兩個鏡像,其中hello_world是我剛剛創建好的鏡像。
$ docker imgaes
alpine
hello_world
docker分層
那么為什么會有兩個鏡像呢?這是由於docker的鏡像分層結構所導致的,如下圖所示。
一個docker鏡像由多個可讀的鏡像層組成,然后運行的容器會在這個docker的鏡像上面多加一層可寫的容器層,任何的對文件的更改都只存在此容器層。因此任何對容器的操作均不會影響到鏡像。
如何實現
至於容器如何獲取鏡像層文件而又不影響到是鏡像層的呢?docker是這樣實現的?
如果需要獲取某個文件,那么容器曾會從上到下去下一層的鏡像層去獲取文件,如果該層文件不存在,那么就會去下一鏡像層去尋找,直到最后一層。
對於用戶而言,用戶面向的是一個疊加后的文件系統。
而任何對於文件的操作都會記錄在容器層,例如說修改文件,容器層會把在鏡像層找到的文件拷貝到容器層然后進行修改,刪除文件則會在容器層內記錄刪除文件的記錄。
綜述
可能會有人會文為什么要這么去做呢?我覺得有兩大好處:
- 基本上每個軟件都是基於某個鏡像去運行的,因此一旦某個底層環境出了問題,就不需要去修改全部基於該鏡像的軟件的鏡像,只需要修改底層環境的鏡像。
- 這個好處也是最大好處,就是可以共享資源,其他相同環境的軟件鏡像都共同去享用同一個環境鏡像,而不需要每個軟件鏡像要去創建一個底層環境。