瞭解 Docker 的三個基本概念,就能夠大體瞭解 Docker 的生命週期。ios
咱們都知道,操做系統分爲內核和用戶空間。對於 Linux 而言,內核啓動後,會掛載 root
文件系統爲其提供用戶空間支持。而 Docker 鏡像(Image),就至關因而一個 root
文件系統。好比官方鏡像 ubuntu:18.04
就包含了完整的一套 Ubuntu 18.04 最小系統的 root
文件系統。Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建以後也不會被改變ubuntu
由於 鏡像包含了操做系統完整的 root 文件系統,其體積仍是很巨大的,因此引入了 Unios FS 技術,將其設計爲分層存儲的架構。因此鏡像不是那種 ISO 打包文件,鏡像是一個虛擬的概念,它是由一組文件系統構成,或者說多層文件系統聯合構成。服務器
鏡像在構建時,是一層層構建,上一層是下一層的基礎,每一層構建結束就不會在被修改,後一層任何修改只會做用在當前層。例如刪除上一層文件,不會真的刪除該文件,而是會標記刪除而後隱藏起來,最終運行容器的時候不會被看見,可是會一直跟隨鏡像。所以構建鏡像時須要當心,不要添加不須要的東西,任何額外的東西都要在本層構建完以前清除。網絡
分層存儲使鏡像的定製和複用變得容易,能夠用以前作好的鏡像做爲基礎層,而後添加新的層,定製本身所須要的東西,構建新的鏡像。架構
鏡像(Image)和容器(Conatiner)的關係就像是面向對象的類和實例同樣,鏡像是靜態的定義,容器是鏡像運行的實體,容器能夠被建立,啓動,中止,刪除,暫停等。容器的實質是進程,可是又和宿主的進程不一樣,容器有本身的獨立命名空間,所以容器擁有本身 root 文件系統,本身的網絡配置,本身的進程空間,甚至本身的用戶 ID 空間。容器內的進程是運行在一個隔離的環境裏,使用起來,就好像是在一個獨立於宿主的系統下操做同樣。因此好多初學者都會把容器和虛擬機搞混。容器一樣和鏡像同樣使用分層存儲,以鏡像爲基礎層,在上面建立了一個容器存儲層,是爲了容器運行時讀寫準備的。注意,在容器被刪除後,容器存儲層保存的任何信息都不會保存,它和容器的生命週期同樣,因此任何須要保存的數據 Docker 建議保存在數據卷(Volumes)或者宿主機目錄中,這樣數據不會隨着容器的消失而消失。操作系統
鏡像構建完成後,能夠很容易的在當前宿主機上運行,可是,若是須要在其它服務器上使用這個鏡像,咱們就須要一個集中的存儲、分發鏡像的服務,Docker Registry 就是這樣的服務。設計
一個 Docker Registry 能夠有多個 倉庫(Repository),每一個倉庫能夠含多個標籤(Tag),每一個標籤都是一個鏡像。code
最初我沒有搞懂 Docker Registry 和 倉庫(Repository),簡單來講就是 Docker Registry 是註冊服務器,用於管理鏡像倉庫,起到服務器的做用,倉庫(Repository)就是存儲鏡像,起到存儲鏡像的做用。默認的 Docker Registry 就是 Docker Hub,其中擁有不少高質量的鏡像。對象