鏡像的分層特性
在說docker的文件系統之前,我們需要先想清楚一個問題。我們知道docker的啟動是依賴於image,docker在啟動之前,需要先拉取image,然後啟動。多個容器可以使用同一個image啟動。那麼問題來了:這些個容器是共用一個image,還是各自將這個image複製了一份,然後各自獨立運行呢?
我們假設每個容器都複製了一份這個image,然後各自獨立運行,那麼就意味著,啟動多少個容器,就需要複製多少個image,毫無疑問這是對空間的一種巨大浪費。事實上,在容器的設計當中,通過同一個Image啟動的容器,全部都共享這個image,而並不複製。那麼問題又隨之而來:既然所有的容器都共用這一個image,那麼豈不是我在任意一個容器中所做的修改,在其他容器中都可見?如果我一個容器要將一個配置文件修改成A,而另一個容器同樣要將這個文件修改成B,兩個容器豈不是會產生衝突?
我們把上面的問題放一放,先來看下面一個拉取鏡像的示例:
root@ubuntu:~# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
be8881be8156: Pull complete
32d9726baeef: Pull complete
87e5e6f71297: Pull complete
Digest: sha256:6ae5dd1664d46b98257382fd91b50e332da989059482e2944aaa41ae6cf8043a
Status: Downloaded newer image for nginx:latest
上面的示例是從docker官方鏡像倉庫拉取一個nginx:latest鏡像,可以看到在拉取鏡像時,是一層一層的拉取的。事實上鏡像也是這麼一層一層的存儲在磁碟上的。通常一個應用鏡像包含多層,如下: