Docker容器和鏡像的區別


  在學習使用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 ---

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM