Docker之镜像、容器、仓库概念
Docker鏡像
操作系統(tǒng)分為內(nèi)核和用戶空間。對(duì)于 Linux 而言,內(nèi)核啟動(dòng)后,會(huì)掛載 root 文件系統(tǒng)為其提供用戶空間支持。而 Docker 鏡像(Image),就相當(dāng)于是一個(gè) root 文件系統(tǒng)。
Docker 鏡像是一個(gè)特殊的文件系統(tǒng),除了提供容器運(yùn)行時(shí)所需的程序、庫(kù)、資源、配置等文件外,還包含了一些為運(yùn)行時(shí)準(zhǔn)備的一些配置參數(shù)(如匿名卷、環(huán)境變量、用戶等)。鏡像不包含任何動(dòng)態(tài)數(shù)據(jù),其內(nèi)容在構(gòu)建之后也不會(huì)被改變。
官方鏡像下載地址:https://hub.docker.com/
鏡像并非是像一個(gè) ISO 那樣的打包文件,鏡像只是一個(gè)虛擬的概念,其實(shí)際體現(xiàn)并非由一個(gè)文件組成,而是由一組文件系統(tǒng)組成,或者說(shuō),由多層文件系統(tǒng)聯(lián)合組成。
Docker 容器
鏡像(Image)和容器(Container)的關(guān)系,就像是面向?qū)ο蟪绦蛟O(shè)計(jì)中的 類(lèi) 和 實(shí)例 一樣,鏡像是靜態(tài)的定義,容器是鏡像運(yùn)行時(shí)的實(shí)體。容器可以被創(chuàng)建、啟動(dòng)、停止、刪除、暫停等。
容器的實(shí)質(zhì)是進(jìn)程,但與直接在宿主執(zhí)行的進(jìn)程不同,容器進(jìn)程運(yùn)行于屬于自己的獨(dú)立的 命名空間。因此容器可以擁有自己的 root 文件系統(tǒng)、自己的網(wǎng)絡(luò)配置、自己的進(jìn)程空間,甚至自己的用戶 ID 空間。容器內(nèi)的進(jìn)程是運(yùn)行在一個(gè)隔離的環(huán)境里,使用起來(lái),就好像是在一個(gè)獨(dú)立于宿主的系統(tǒng)下操作一樣。這種特性使得容器封裝的應(yīng)用比直接在宿主運(yùn)行更加安全。也因?yàn)檫@種隔離的特性,很多人初學(xué) Docker 時(shí)常常會(huì)混淆容器和虛擬機(jī)。
前面講過(guò)鏡像使用的是分層存儲(chǔ),容器也是如此。每一個(gè)容器運(yùn)行時(shí),是以鏡像為基礎(chǔ)層,在其上創(chuàng)建一個(gè)當(dāng)前容器的存儲(chǔ)層,我們可以稱(chēng)這個(gè)為容器運(yùn)行時(shí)讀寫(xiě)而準(zhǔn)備的存儲(chǔ)層為容器存儲(chǔ)層。
容器存儲(chǔ)層的生存周期和容器一樣,容器消亡時(shí),容器存儲(chǔ)層也隨之消亡。因此,任何保存于容器存儲(chǔ)層的信息都會(huì)隨容器刪除而丟失。
按照 Docker 最佳實(shí)踐的要求,容器不應(yīng)該向其存儲(chǔ)層內(nèi)寫(xiě)入任何數(shù)據(jù),容器存儲(chǔ)層要保持無(wú)狀態(tài)化。所有的文件寫(xiě)入操作,都應(yīng)該使用 數(shù)據(jù)卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫(xiě)會(huì)跳過(guò)容器存儲(chǔ)層,直接對(duì)宿主(或網(wǎng)絡(luò)存儲(chǔ))發(fā)生讀寫(xiě),其性能和穩(wěn)定性更高。
數(shù)據(jù)卷的生存周期獨(dú)立于容器,容器消亡,數(shù)據(jù)卷不會(huì)消亡。因此,使用數(shù)據(jù)卷后,容器刪除或者重新運(yùn)行之后,數(shù)據(jù)卻不會(huì)丟失。
倉(cāng)庫(kù) Docker Registry
鏡像構(gòu)建完成后,可以很容易的在當(dāng)前宿主機(jī)上運(yùn)行,但是,如果需要在其它服務(wù)器上使用這個(gè)鏡像,我們就需要一個(gè)集中的存儲(chǔ)、分發(fā)鏡像的服務(wù),Docker Registry 就是這樣的服務(wù)。
一個(gè) Docker Registry 中可以包含多個(gè)倉(cāng)庫(kù)(Repository);每個(gè)倉(cāng)庫(kù)可以包含多個(gè)標(biāo)簽(Tag);每個(gè)標(biāo)簽對(duì)應(yīng)一個(gè)鏡像。
通常,一個(gè)倉(cāng)庫(kù)會(huì)包含同一個(gè)軟件不同版本的鏡像,而標(biāo)簽就常用于對(duì)應(yīng)該軟件的各個(gè)版本。我們可以通過(guò) <倉(cāng)庫(kù)名>:<標(biāo)簽> 的格式來(lái)指定具體是這個(gè)軟件哪個(gè)版本的鏡像。如果不給出標(biāo)簽,將以 latest 作為默認(rèn)標(biāo)簽。
以 Ubuntu 鏡像 為例,ubuntu 是倉(cāng)庫(kù)的名字,其內(nèi)包含有不同的版本標(biāo)簽,如,14.04, 16.04。我們可以通過(guò) ubuntu:14.04,或者 ubuntu:16.04 來(lái)具體指定所需哪個(gè)版本的鏡像。如果忽略了標(biāo)簽,比如 ubuntu,那將視為 ubuntu:latest。
倉(cāng)庫(kù)名經(jīng)常以 兩段式路徑 形式出現(xiàn),比如 jwilder/nginx-proxy,前者往往意味著 Docker Registry 多用戶環(huán)境下的用戶名,后者則往往是對(duì)應(yīng)的軟件名。但這并非絕對(duì),取決于所使用的具體 Docker Registry 的軟件或服務(wù)。
最常使用的 Registry 公開(kāi)服務(wù)是官方的 Docker Hub,這也是默認(rèn)的 Registry,并擁有大量的高質(zhì)量的官方鏡像。
由于某些原因,在國(guó)內(nèi)訪問(wèn)這些服務(wù)可能會(huì)比較慢。國(guó)內(nèi)的一些云服務(wù)商提供了針對(duì) Docker Hub 的鏡像服務(wù)(Registry Mirror),這些鏡像服務(wù)被稱(chēng)為加速器。常見(jiàn)的有 阿里云加速器、DaoCloud 加速器 等。使用加速器會(huì)直接從國(guó)內(nèi)的地址下載 Docker Hub 的鏡像,比直接從 Docker Hub 下載速度會(huì)提高很多。在 安裝 Docker 一節(jié)中有詳細(xì)的配置方法。
國(guó)內(nèi)也有一些云服務(wù)商提供類(lèi)似于 Docker Hub 的公開(kāi)服務(wù)。比如 時(shí)速云鏡像倉(cāng)庫(kù)、網(wǎng)易云鏡像服務(wù)、DaoCloud 鏡像市場(chǎng)、阿里云鏡像庫(kù) 等。
------做運(yùn)維之前很矯情的小年輕-----【本博文摘自Docker----從入門(mén)到實(shí)踐】
總結(jié)
以上是生活随笔為你收集整理的Docker之镜像、容器、仓库概念的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Docker之docker简介及其优势
- 下一篇: Docker之Dockerfile 指令