Docker鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建以後也不會被改變。Docker 設計時,就充分利用 Union FS的技術,將其設計爲 分層存儲的架構 。鏡像實際是由多層文件系統聯合組成。鏡像構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在本身這一層。好比,刪除前一層文件的操做,實際不是真的刪除前一層的文件,而是僅在當前層標記爲該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,可是實際上該文件會一直跟隨鏡像。所以,在構建鏡像的時候,須要額外當心,每一層儘可能只包含該層須要添加的東西,任何額外的東西應該在該層構建結束前清理掉。分層存儲的特徵還使得鏡像的複用、定製變的更爲容易。甚至能夠用以前構建好的鏡像做爲基礎層,而後進一步添加新的層,以定製本身所需的內容,構建新的鏡像。docker
鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中的類 和 實例 同樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器能夠被建立、啓動、中止、刪除、暫停等。容器的實質是進程,但與直接在宿主執行的進程不一樣,容器進程運行於屬於本身的獨立的命名空間。前面講過鏡像使用的是分層存儲,容器也是如此。容器存儲層的生存週期和容器同樣,容器消亡時,容器存儲層也隨之消亡。所以,任何保存於容器存儲層的信息都會隨容器刪除而丟失。按照 Docker 最佳實踐的要求,容器不該該向其存儲層內寫入任何數據 ,容器存儲層要保持無狀態化。全部的文件寫入操做,都應該使用數據卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。數據卷的生存週期獨立於容器,容器消亡,數據卷不會消亡。所以, 使用數據卷後,容器能夠隨意刪除、從新 run ,數據卻不會丟失。服務器
鏡像構建完成後,能夠很容易的在當前宿主上運行,可是,若是須要在其它服務器上使用這個鏡像,咱們就須要一個集中的存儲、分發鏡像的服務,Docker Registry就是這樣的服務。一個 Docker Registry中能夠包含多個倉庫(Repository);每一個倉庫能夠包含多個標(Tag);每一個標籤對應一個鏡像。因此說:鏡像倉庫是Docker用來集中存放鏡像文件的地方相似於咱們以前經常使用的代碼倉庫。一般,一個倉庫會包含同一個軟件不一樣版本的鏡像,而標籤就經常使用於對應該軟件的各個版本。咱們能夠經過 <倉庫名>:<標籤>的格式來指定具體是這個軟件哪一個版本的鏡像。若是不給出標籤,將以 latest 做爲默認標籤.。最常使用的 Registry 公開服務是官方的 Docker Hub ,這也是默認的 Registry,並擁有大量的高質量的官方鏡像。除了使用公開服務外,用戶還能夠在 本地搭建私有 Docker Registry 。Docker 官方提供了 Docker Registry 鏡像,能夠直接使用作爲私有 Registry 服務。開源的 Docker Registry 鏡像只提供了 Docker Registry API 的服務端實現,足以支持 docker 命令,不影響使用。但不包含圖形界面,以及鏡像維護、用戶管理、訪問控制等高級功能。網絡
東軟SaCa Aclome雲管理平臺支持雲上管理架構