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