Docker系列文章--基本概念

1.4基本概念

Docker 包括三個基本概念nginx

鏡像(lmagedocker

容器(Containerubuntu

倉庫(Repository安全

理解了這三個概念,就理解了Docker的整個生命週期服務器

Docker 鏡像

咱們都知道,操做系統分爲內核和用戶空間。對於 Linux 而言,內核啓動後,會掛載 root 文件系統爲其提供用戶空間支持。而 Docker 鏡像(Image,就至關因而一個 root 文件系統。好比官方鏡像 ubuntu:14.04 就包含了完整的一套Ubuntu14.04 最小系統的 root 文件系統。網絡

Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建以後也不會被改變。架構

分層存儲app

由於鏡像包含操做系統完整的root 文件系統,其體積每每是龐大的,所以在Docker設計時,就充分利用 Union FS 的技術,將其設計爲分層存儲的架構。因此嚴格來講,鏡像並不是是像一個 ISO 那樣的打包文件,鏡像只是一個虛擬的概念,其實際體現並不是由一個文件組成,而是由一組文件系統組成,或者說,由多層文件系統聯合組成。ide

鏡像構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在本身這一層。好比,刪除前一層文件的操做,實際不是真的刪除前一層的文件,而是僅在當前層標記爲該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,可是實際上該文件會一直跟隨鏡像。所以,在構建鏡像的時候,須要額外當心,每一層儘可能只包含該層須要添加的東西,任何額外的東西應該在該層構建結束前清理掉。性能

分層存儲的特徵還使得鏡像的複用、定製變的更爲容易。甚至能夠用以前構建好的鏡像做爲基礎層,而後進一步添加新的層,以定製本身所需的內容,構建新的鏡像。

關於鏡像構建,將會在後續相關章節中作進一步的講解。

Docker 容器

鏡像(Image 和容器(Container 的關係,就像是面向對象程序設計中的  實例 同樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器能夠被建立、啓動、中止、刪除、暫停等。

容器的實質是進程,但與直接在宿主執行的進程不一樣,容器進程運行於屬於本身的獨立的命名空間。所以容器能夠擁有本身的 root 文件系統、本身的網絡配置、本身的進程空間,甚至本身的用戶 ID 空間。容器內的進程是運行在一個隔離的環境裏,使用起來,就好像是在一個獨立於宿主的系統下操做同樣。這種特性使得容器封裝的應用比直接在宿主運行更加安全。也由於這種隔離的特性,不少人初學Docker 時經常會把容器和虛擬機搞混。

前面講過鏡像使用的是分層存儲,容器也是如此。每個容器運行時,是以鏡像爲基礎層,在其上建立一個當前容器的存儲層,咱們能夠稱這個爲容器運行時讀寫而準備的存儲層爲容器存儲層。

容器存儲層的生存週期和容器同樣,容器消亡時,容器存儲層也隨之消亡。所以,任何保存於容器存儲層的信息都會隨容器刪除而丟失。按照 Docker 最佳實踐的要求,容器不該該向其存儲層內寫入任何數據,容器存儲層要保持無狀態化。全部的文件寫入操做,都應該使用數據卷(Volume 、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。

數據卷的生存週期獨立於容器,容器消亡,數據卷不會消亡。所以,使用數據卷後,容器能夠隨意刪除、從新 run ,數據卻不會丟失。

Docker Registry

鏡像構建完成後,能夠很容易的在當前宿主上運行,可是,若是須要在其它服務器上使用這個鏡像,咱們就須要一個集中的存儲、分發鏡像的服務,Docker Registry就是這樣的服務。

一個 DockerRegistry 中能夠包含多個倉庫(Repository ;每一個倉庫能夠包含多個標籤(Tag ;每一個標籤對應一個鏡像。一般,一個倉庫會包含同一個軟件不一樣版本的鏡像,而標籤就經常使用於對應該軟件的各個版本。咱們能夠經過 <倉庫名>:<標籤的格式來指定具體是這個軟件哪一個版本的鏡像。若是不給出標籤,將以 latest 做爲默認標籤。以Ubuntu 鏡像 爲例, ubuntu 是倉庫的名字,其內包含有不一樣的版本標籤,如,14.04 , 16.04 。咱們能夠經過 ubuntu:14.04 ,或者 ubuntu:16.04來具體指定所需哪一個版本的鏡像。若是忽略了標籤,好比 ubuntu ,那將視爲ubuntu:latest 

倉庫名常常以 兩段式路徑 形式出現,好比 jwilder/nginx-proxy ,前者每每意味着Docker Registry 多用戶環境下的用戶名,後者則每每是對應的軟件名。但這並不是絕對,取決於所使用的具體Docker Registry 的軟件或服務。

Docker Registry 公開服務

Docker Registry 公開服務是開放給用戶使用、容許用戶管理鏡像的 Registry 服務。通常這類公開服務容許用戶免費上傳、下載公開的鏡像,並可能提供收費服務供用戶管理私有鏡像。

最常使用的Registry 公開服務是官方的 Docker Hub,這也是默認的 Registry,並擁有大量的高質量的官方鏡像。除此之外,還有 CoreOS  Quay.ioCoreOS 相關的鏡像存儲在這裏;Google Google Container RegistryKubernetes 的鏡像使用的就是這個服務。

因爲某些緣由,在國內訪問這些服務可能會比較慢。國內的一些雲服務商提供了針對 Docker Hub 的鏡像服務(RegistryMirror ,這些鏡像服務被稱爲加速器。常見的有 阿里雲加速器、DaoCloud 加速器、靈雀雲加速器等。使用加速器會直接從國倉庫的地址下載 Docker Hub 的鏡像,比直接從官方網站下載速度會提升不少。在後面的章節中會有進一步如何配置加速器的講解。

國內也有一些雲服務商提供相似於 Docker Hub 的公開服務。好比 時速雲鏡像倉庫、網易雲鏡像服務、DaoCloud 鏡像市場、阿里雲鏡像庫等。

私有Docker Registry

除了使用公開服務外,用戶還能夠在本地搭建私有 Docker RegistryDocker 官方提供了 Docker Registry 鏡像,能夠直接使用作爲私有 Registry 服務。在後續的相關章節中,會有進一步的搭建私有 Registry 服務的講解。

開源的 DockerRegistry 鏡像只提供了 DockerRegistry API 的服務端實現,足以支持 docker 命令,不影響使用。但不包含圖形界面,以及鏡像維護、用戶管理、訪問控制等高級功能。在官方的商業化版本 Docker Trusted Registry 中,提供了這些高級功能。

除了官方的 DockerRegistry 外,還有第三方軟件實現了 DockerRegistry API,甚至提供了用戶界面以及一些高級功能。好比,VMWare Harbor  SonatypeNexus。


相關文章
相關標籤/搜索