【Docker】(2)---倉庫、鏡像、容器
學習Docker,我覺得首先要了解的是倉庫、鏡像、容器到底是什么,他們有什么區別。
一、通俗理解
1、Docker 鏡像 (images)
容器運行時的只讀模板,操作系統+軟件運行環境+用戶程序。
例如:一個鏡像可以完全包含了Ubuntu操作系統環境,可以把它稱作一個Ubuntu鏡像。鏡像也可以安裝了Apache應用程序(或其他軟件),可以把它稱為一個Apache鏡像。
我們可以大致的把鏡像比喻成一個java類:
class User{
private String name;
private int age;
}
2、Docker 容器 (containers)
容器是從鏡像創建的應用運行實例,可以將其啟動、開始、停止、刪除,而這些容器都是相互隔離、互不可見的。Docker利用容器來運行和隔離應用。
我們可以大致理解容器是類實例出的對象:
User user = new User()
3、Docker 倉庫(registeries)
Docker倉庫(Repository)用來保存鏡像,類似與代碼倉庫,是Docker集中存放鏡像文件的場所。
Docker 倉庫有公有和私有倉庫,好比Maven的中央倉庫和本地私服。
總結鏡像、容器、倉庫這三部分組成了Docker的整個生命周期,如下圖所示,容器是由鏡像實例化而來的,這和我們學習的面向對象的概念十分相似,我們可以把鏡像想象成類,把容器想象成類經過實例化后的對象,這樣就非常好理解鏡像和容器的關系。

二、深層次理解
要點:容器的定義和鏡像幾乎一模一樣,也是一堆層的統一視角,唯一區別在於容器的最上面那一層是可讀可寫的。
要點:容器 = 鏡像 + 讀寫層。並且容器的定義並沒有提及是否要運行容器。

1、鏡像
鏡像就是一堆只讀層(read-only layer)的統一視角,也許這個定義有些難以理解,下面的這張圖能夠幫助讀者理解鏡像的定義。

從左邊我們看到了多個只讀層,它們重疊在一起。除了最下面一層,其它層都會有一個指針指向下一層。這些層是Docker內部的實現細節,並且能夠在主機(譯者注:運行Docker的機器)的文件系統上訪問到。統一文件系統(union file system)技術能夠將不同的層整合成一個文件系統,為這些層提供了一個統一的視角,這樣就隱藏了多層的存在,在用戶的角度看來,只存在一個文件系統。
2、容器
容器(container)的定義和鏡像(image)幾乎一模一樣,也是一堆層的統一視角,唯一區別在於容器的最上面那一層是可讀可寫的。

需要注意:容器的定義並沒有提及容器是否在運行。
3、運行態容器
一個運行態容器被定義為一個可讀寫的統一文件系統加上隔離的進程空間和包含其中的進程。下面這張圖片展示了一個運行中的容器。

一個容器中的進程可能會對文件進行修改、刪除、創建,這些改變都將作用於可讀寫層(read-write layer)。下面這張圖展示了這個行為。

參考
如果一個人充滿快樂,正面的思想,那么好的人事物就會和他共鳴,而且被他吸引過來。同樣,一個人老帶悲傷,倒霉的事情也會跟過來。
——在自己心情低落的時候,告誡自己不要把負能量帶給別人。(大校4)
