Docker容器和鏡像的區別

  在學習使用docker過程當中會遇到鏡像和容器,二者之間的區別是什麼?有什麼關聯?本文將用圖文並茂的方式介紹容器、鏡像的區別,可以很好的幫助各位深刻理解Docker。html

              

1、什麼是鏡像?

1.1 Image Layer(鏡像層)

  鏡像能夠當作是由多個鏡像層疊加起來的一個文件系統(經過UnionFS與AUFS文件聯合系統實現),鏡像層也能夠簡單理解爲一個基本的鏡像,而每一個鏡像層之間經過指針的形式進行疊加。linux

      

  根據上圖,鏡像層的主要組成部分包括鏡像層 ID、鏡像層指針 「指向父層」、元數據「 Layer Metadata,包含了 Docker 構建和運行的信息和父層的層次信息」。只讀層和讀寫層「Top Layer」的組成部分基本一致,同時讀寫層能夠轉換成只讀層「 經過docker commit 操做實現」。docker

  元數據(metadata)就是關於這個層的額外信息,它不只可以讓Docker獲取運行和構建時的信息,還包括父層的層次信息。須要注意,只讀層和讀寫層都包含元數據。json

                  

  每一層都包括了一個指向父層的指針。若是一個層沒有這個指針,說明它處於最底層。ubuntu

            

  Metadata Location:
  在docker主機中鏡像層(image layer)的元數據被保存在名爲」json」的文件中,好比說:網絡

/var/lib/docker/graph/e809f156dc985.../json             ##e809f156dc985...就是這層的id

  一個容器的元數據好像是被分紅了不少文件,但或多或少可以在/var/lib/docker/containers/<id>目錄下找到,<id>就是一個可讀層的id。這個目錄下的文件大可能是運行時的數據,好比說網絡,日誌等等。app

1.2 Image(鏡像,只讀層的集合)

  鏡像是一堆只讀層的統一視角,除了最底層沒有指向外,每一層都指向它的父層。統一文件系統( Union File System)技術可以將不一樣的層整合成一個文件系統,爲這些層提供了一個統一的視角,這樣就隱藏了多層的存在。在用戶的角度看來,只存在一個文件系統。鏡像每一層都是不可寫的,都是隻讀層。post

            

  咱們能夠看到鏡像包含多個只讀層,它們重疊在一塊兒。除了最下面一層,其它層都會有一個指針指向下一層。這些層是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、什麼是容器?

2.1 Container(容器,一層讀寫層+多層只讀層)

  容器(container)的定義和鏡像(image)幾乎如出一轍,也是一堆層的統一視角,惟一區別在於容器的最上面那一層是可讀可寫的。要點:容器 = 鏡像 + 讀寫層,而且容器的定義並無說起是否要運行容器。spa

            

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

3、總結

  經過上述內容,咱們已經詳細介紹了鏡像與容器的區別,鏡像由一層層只讀層堆在一塊兒,容器爲鏡像只讀層+讀寫層,運行態容器爲由一個可讀寫的文件系統「靜態容器」+ 隔離的進程空間和其中的進程構成。

 

參考文獻:

  1.https://docs.docker.com

  2.http://dockone.io/article/783

  3.https://www.hi-linux.com/posts/44544.html

 

                                --- END ---

相關文章
相關標籤/搜索