從總體的角度來說,一個完整的Docker鏡像能夠支撐一個Docker容器的運行,在 Docker容器運行過程當中主要提供文件系統視角。例如一個ubuntu:14.04的鏡像,提供了一個基本的ubuntu:14.04的發行版,固然此 鏡像是不包含操做系統Linux內核的。mysql
說到此,可能就須要注意一下,linux內核和ubuntu:14.04Docker鏡像的區別了。傳統虛擬機安裝ubuntu:14.04會包含兩部分,第一,某一個Linux內核的發行版本,好比Linux 3.8版本的內核;第二,第一個特定的Ubuntu發行版,這部份內容不包含Linux內核,可是包含Linux以外的軟件管理方式,軟件驅動,如 apt-get軟件管理包等。linux
理解以上內容以後,就能夠理解,爲何在一個Linux內核版本爲3.8的ubuntu:14.04基礎上,能夠把Linux內核版本升級到3.18,而ubuntu的版本依然是14.04。最主要的就是:Linux內核版本與ubuntu操做系統發行版之間的區別。golang
Linux內核+ubuntu操做系統發行版,組成一臺工做的機器讓用戶體驗。那麼靈活替換ubuntu操做系統發行版,那是否是也能夠實現呢。那麼Docker很方便的利用了這一點,技術手段就是Docker鏡像。sql
Docker的架構中,Docker鏡像就是相似於「ubuntu操做系統發行版」,可 以在任何知足要求的Linux內核之上運行。簡單一點有「Debian操做系統發行版」Docker鏡像、「Ubuntu操做系統發行版」Docker鏡 像;若是在Debian鏡像中安裝MySQL 5.6,那咱們能夠將其命名爲Mysql:5.6鏡像;若是在Debian鏡像中安裝有Golang 1.3,那咱們能夠將其命名爲golang:1.3鏡像;以此類推,你們能夠根據本身安裝的軟件,獲得任何本身想要的鏡像。docker
那麼鏡像最後的做用是什麼呢?很好理解,回到Linux內核上來運行,經過鏡像來運行時咱們經常將提供的環境稱爲容器。json
以上內容是從宏觀的角度看看Docker鏡像是什麼,咱們再從微觀的角度進一步深刻 Docker鏡像。剛纔提到了「Debian鏡像中安裝MySQL 5.6,就成了mysql:5.6鏡像」,其實在此時Docker鏡像的層級概念就體現出來了。底層一個Debian操做系統鏡像,上面疊加一個 mysql層,就完成了一個mysql鏡像的構建。層級概念就不難理解,此時咱們通常debian操做系統鏡像稱爲mysql鏡像層的父鏡像。ubuntu
層級管理的方式大大便捷了Docker鏡像的分發與存儲。說到分發,你們天然會聯想到 Docker鏡像的靈活性,傳輸的便捷性,以及高超的移植性。Docker Hub,做爲全球的鏡像倉庫,做爲Docker生態中的數據倉庫,將全世界的Docker數據匯聚在一塊兒,是Docker生態的命脈。架構
Docker有兩方面的技術很是重要,第一是Linux 容器方面的技術,第二是Docker鏡像的技術。從技術自己來說,二者的可複製性很強,不存在絕對的技術難點,然而Docker Hub因爲存在大量的數據的緣由,致使Docker Hub的可複製性幾乎不存在,這須要一個生態的營造。spa
大體介紹了Docker鏡像是什麼,咱們來看看Docker鏡像中有哪些內容?操作系統
介紹以前,我先分享一下,我我的在接觸Docker的兩年時間中,對Docker鏡像內容認識的變化。
第一階段:初步接觸Docker。相信不少愛好者都會和我同樣,有這樣一個認識:Docker 鏡像表明一個容器的文件系統內容;
第二階段:初步接觸聯合文件系統。聯合文件系統的概念,讓我意識到鏡像層級管理的技術,每一層鏡像都是容器文件系統內容的一部分。
第三階段:研究鏡像與容器的關係:容器是一個動態的環境,每一層鏡像中的文件屬於靜態內 容,然而 Dockerfile 中的 ENV、VOLUME、CMD 等內容最終都須要落實到容器的運行環境中,而這些內容均不可能直接坐落到每一層鏡像所包含的文件系統內容中,那此時每個Docker鏡像還會包含 json文件記錄與容器之間的關係。
所以,Docker鏡像的內容主要包含兩個部分:第一,鏡像層文件內容;第二,鏡像json文件。
既然是說鏡像存儲的位置,那麼應該包含:鏡像層文件和鏡像json文件。如一個ubuntu:14.04鏡像,包含4個鏡像層,在aufs存儲驅動的狀況下,在磁盤上的狀況能夠如如下圖所示:
咱們能夠經過命令 docker history ubuntu:14.04 查看 ubuntu:14.04,結果以下:
Docker 鏡像層的內容通常在 Docker 根目錄的 aufs 路徑下,爲 /var/lib/docker/aufs/diff/,具體狀況以下:
圖中顯示了鏡像 ubuntu:14.04 的 4 個鏡像層內容,以及每一個鏡像層內的一級目錄狀況。須要額外注意的是:鏡像層 d2a0ecffe6fa 中沒有任何內容,也就是所謂的空鏡像。
對於每個鏡像層,Docker 都會保存一份相應的 json 文件,json 文件的存儲路徑爲 /var/lib/docker/graph,ubuntu:14.04 全部鏡像層的 json 文件存儲路徑展現以下:
除了 json 文件,你們還看到每個鏡像層還包含一個 layersize 文件,該文件主要記錄鏡像層內部文件內容的總大小。既然談到了鏡像 json 文件,爲了給下文鋪墊,如下貼出 ubuntu:14.04 中空鏡像層 d2a0ecffe6fa 的 json 文件: