在學習使用docker過程中會遇到鏡像和容器,兩者之間的區別是什么?有什么關聯?本文將用圖文並茂的方式介紹容器、鏡像的區別,能夠很好的幫助各位深入理解Docker。
一、什么是鏡像?
1.1 Image Layer(鏡像層)
鏡像可以看成是由多個鏡像層疊加起來的一個文件系統(通過UnionFS與AUFS文件聯合系統實現),鏡像層也可以簡單理解為一個基本的鏡像,而每個鏡像層之間通過指針的形式進行疊加。
根據上圖,鏡像層的主要組成部分包括鏡像層 ID、鏡像層指針 「指向父層」、元數據「 Layer Metadata,包含了 Docker 構建和運行的信息和父層的層次信息」。只讀層和讀寫層「Top Layer」的組成部分基本一致,同時讀寫層可以轉換成只讀層「 通過docker commit
操作實現」。
元數據(metadata)就是關於這個層的額外信息,它不僅能夠讓Docker獲取運行和構建時的信息,還包括父層的層次信息。需要注意,只讀層和讀寫層都包含元數據。
每一層都包括了一個指向父層的指針。如果一個層沒有這個指針,說明它處於最底層。
Metadata Location:
在docker主機中鏡像層(image layer)的元數據被保存在名為”json”的文件中,比如說:
/var/lib/docker/graph/e809f156dc985.../json ##e809f156dc985...就是這層的id
一個容器的元數據好像是被分成了很多文件,但或多或少能夠在/var/lib/docker/containers/<id>目錄下找到,<id>就是一個可讀層的id。這個目錄下的文件大多是運行時的數據,比如說網絡,日志等等。
1.2 Image(鏡像,只讀層的集合)
鏡像是一堆只讀層的統一視角,除了最底層沒有指向外,每一層都指向它的父層。統一文件系統( Union File System)技術能夠將不同的層整合成一個文件系統,為這些層提供了一個統一的視角,這樣就隱藏了多層的存在。在用戶的角度看來,只存在一個文件系統。鏡像每一層都是不可寫的,都是只讀層。
我們可以看到鏡像包含多個只讀層,它們重疊在一起。除了最下面一層,其它層都會有一個指針指向下一層。這些層是Docker內部的實現細節,並且能夠在docker主機的文件系統上訪問到。統一文件系統(union file system,升級版為AUFS)技術能夠將不同的層整合成一個文件系統,為這些層提供了一個統一的視角,這樣就隱藏了多層的存在,在用戶的角度看來,只存在一個文件系統。我們可以在圖片的右邊看到這個視角的形式。
你可以在你的主機文件系統上找到有關這些層的文件。需要注意的是,在一個運行中的容器內部,這些層是不可見的。在我的主機上,我發現它們存在於/var/lib/docker/aufs目錄下。
sudo tree -L 1 /var/lib/docker/ /var/lib/docker/ ├── aufs ├── containers ├── graph ├── init ├── linkgraph.db ├── repositories-aufs ├── tmp ├── trust └── volumes 7 directories, 2 files
二、什么是容器?
2.1 Container(容器,一層讀寫層+多層只讀層)
容器(container)的定義和鏡像(image)幾乎一模一樣,也是一堆層的統一視角,唯一區別在於容器的最上面那一層是可讀可寫的。要點:容器 = 鏡像 + 讀寫層,並且容器的定義並沒有提及是否要運行容器。
2.2 Running Container(運行態容器,一層讀寫層+多層只讀層+隔離的進程空間和包含其中的進程)
運行狀態的容器「Running Container」是由一個可讀寫的文件系統「靜態容器」+ 隔離的進程空間和其中的進程構成的。下面這張圖片展示了一個運行中的容器。
正是文件系統隔離技術使得Docker成為了一個前途無量的技術。一個容器中的進程可能會對文件進行修改、刪除、創建,這些改變都將作用於可讀寫層(read-write layer)。下面這張圖展示了這個行為。
我們可以通過運行以下命令來驗證我們上面所說的:
docker run ubuntu touch happiness.txt
即便是這個ubuntu容器不再運行,我們依舊能夠在主機的文件系統上找到這個新文件。
find / -name happiness.txt
/var/lib/docker/aufs/diff/860a7b...889/happiness.txt
三、總結
通過上述內容,我們已經詳細介紹了鏡像與容器的區別,鏡像由一層層只讀層堆在一起,容器為鏡像只讀層+讀寫層,運行態容器為由一個可讀寫的文件系統「靜態容器」+ 隔離的進程空間和其中的進程構成。
參考文獻:
1.https://docs.docker.com
2.http://dockone.io/article/783
3.https://www.hi-linux.com/posts/44544.html
--- END ---