久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Dockerfile、Docker鏡像和容器的關(guān)系是什么

152次閱讀
沒有評論

共計 2658 個字符,預(yù)計需要花費 7 分鐘才能閱讀完成。

這篇文章主要介紹“Dockerfile、Docker 鏡像和容器的關(guān)系是什么”,在日常操作中,相信很多人在 Dockerfile、Docker 鏡像和容器的關(guān)系是什么問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Dockerfile、Docker 鏡像和容器的關(guān)系是什么”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學(xué)習(xí)吧!

Dockerfile、Docker 鏡像和 Docker 容器的關(guān)系

Dockerfile 是軟件的原材料,Docker 鏡像是軟件的交付品,而 Docker 容器則可以認為是軟件的運行態(tài)。從應(yīng)用軟件的角度來看,Dockerfile、Docker 鏡像與 Docker 容器分別代表軟件的三個不同階段,Dockerfile 面向開發(fā),Docker 鏡像成為交付標(biāo)準(zhǔn),Docker 容器則涉及部署與運維,三者缺一不可,合力充當(dāng) Docker 體系的基石。

簡單來講,Dockerfile 構(gòu)建出 Docker 鏡像,通過 Docker 鏡像運行 Docker 容器。

我們可以從 Docker 容器的角度,來反推三者的關(guān)系。首先可以來看下圖:

我們假設(shè)這個容器的鏡像通過以下 Dockerfile 構(gòu)建而得:

FROM ubuntu:14.04 
ADD run.sh / 
VOLUME /data 
CMD [./run.sh]

1 Dockerfile 與 Docker 鏡像

首先,我們結(jié)合上圖來看看 Dockerfile 與 Docker 鏡像之間的關(guān)系。

FROM ubuntu:14.04:設(shè)置基礎(chǔ)鏡像,此時會使用基礎(chǔ)鏡像 ubuntu:14.04 的所有鏡像層,為簡單起見,圖中將其作為一個整體展示。

ADD run.sh /:將 Dockerfile 所在目錄的文件 run.sh 加至鏡像的根目錄,此時新一層的鏡像只有一項內(nèi)容,即根目錄下的 run.sh。

VOLUME /data:設(shè)定鏡像的 VOLUME,此 VOLUME 在容器內(nèi)部的路徑為 /data。需要注意的是,此時并未在新一層的鏡像中添加任何文件,即構(gòu)建出的磁層鏡像中文件為空,但更新了鏡像的 json 文件,以便通過此鏡像啟動容器時獲取這方面的信息。

CMD [./run.sh]:設(shè)置鏡像的默認執(zhí)行入口,此命令同樣不會在新建鏡像中添加任何文件,僅僅在上一層鏡像 json 文件的基礎(chǔ)上更新新建鏡像的 json 文件。

因此,通過以上分析,以上的 Dockerfile 可以構(gòu)建出一個新的鏡像,包含 4 個鏡像層,每一條命令會和一個鏡像層對應(yīng),鏡像之間會存在父子關(guān)系。圖中很清楚的表明了這些關(guān)系。

2 Docker 鏡像與 Docker 容器的關(guān)系

Docker 鏡像是 Docker 容器運行的基礎(chǔ),沒有 Docker 鏡像,就不可能有 Docker 容器,這也是 Docker 的設(shè)計原則之一。

可以理解的是:Docker 鏡像畢竟是鏡像,屬于靜態(tài)的內(nèi)容;而 Docker 容器就不一樣了,容器屬于動態(tài)的內(nèi)容。動態(tài)的內(nèi)容,大家很容易聯(lián)想到進程,內(nèi)存,CPU 等之類的東西。的確,Docker 容器作為動態(tài)的內(nèi)容,都會包含這些。

為了便于理解,大家可以把 Docker 容器,理解為一個或多個運行進程,而這些運行進程將占有相應(yīng)的內(nèi)存,相應(yīng)的 CPU 計算資源,相應(yīng)的虛擬網(wǎng)絡(luò)設(shè)備以及相應(yīng)的文件系統(tǒng)資源。而 Docker 容器所占用的文件系統(tǒng)資源,則通過 Docker 鏡像的鏡像層文件來提供。

那么作為靜態(tài)的鏡像,如何才有能力轉(zhuǎn)化為一個動態(tài)的 Docker 容器呢?此時,我們可以想象:第一,轉(zhuǎn)化的依據(jù)是什么;第二,由誰來執(zhí)行這個轉(zhuǎn)化操作。

其實,轉(zhuǎn)化的依據(jù)是每個鏡像的 json 文件,Docker 可以通過解析 Docker 鏡像的 json 的文件,獲知應(yīng)該在這個鏡像之上運行什么樣的進程,應(yīng)該為進程配置怎么樣的環(huán)境變量,此時也就實現(xiàn)了靜態(tài)向動態(tài)的轉(zhuǎn)變。

誰來執(zhí)行這個轉(zhuǎn)化工作?答案是 Docker 守護進程。也許大家早就理解這樣一句 話:Docker 容器實質(zhì)上就是一個或者多個進程,而容器的父進程就是 Docker 守護進程。這樣的,轉(zhuǎn)化工作的執(zhí)行就不難理解了:Docker 守護進程 手握 Docker 鏡像的 json 文件,為容器配置相應(yīng)的環(huán)境,并真正運行 Docker 鏡像所指定的進程,完成 Docker 容器的真正創(chuàng)建。

Docker 容器運行起來之后,Docker 鏡像 json 文件就失去作用了。此時 Docker 鏡像的絕大部分作用就是:為 Docker 容器提供一個文件系統(tǒng)的視角,供容器內(nèi)部的進程訪問文件資源。

再次回到上圖,我們再來看看容器和鏡像之間的一些特殊關(guān)系。首先,之前已經(jīng)提及 Docker 鏡像是分層管理的,管理 Docker 容器的時候,Docker 鏡像仍然是分層管理的。由于此時動態(tài)的容器中已經(jīng)存在進程,進程就會對文件系統(tǒng)視角內(nèi)的文件進行讀寫操作,因此,就會涉及一個問題:容器是否會篡改 Docker 鏡像的內(nèi)容?

答案自然是不會的。統(tǒng)一來講,正如上圖,所有的 Docker 鏡像層對于容器來說,都是只讀的,容器對于文件的寫操作絕對不會作用在鏡像中。

既然如此,實現(xiàn)的原理就很重要,究其根本:Docker 守護進程會在 Docker 鏡像的 最上層之上,再添加一個可讀寫層,容器所有的寫操作都會作用到這一層中。而如果 Docker 容器需要寫底層 Docker 鏡像中的文件,那么此時就會涉及一 個叫 Copy-on-Write 的機制,即 aufs 等聯(lián)合文件系統(tǒng)保證:首先將此文件從 Docker 鏡像層中拷貝至最上層的可讀寫層,然后容器進程再對讀 寫層中的副本進行寫操縱。對于容器進程來講,它只能看到最上層的文件。

那最后我們再來說說:Docker 容器的文件系統(tǒng)視角中,到底是不是存在一些內(nèi)容,不是存儲于 Docker 鏡像中的?

這次的答案依舊是肯定的。

再次重申一點,Docker 鏡像中存儲的都是一些靜態(tài)文件。這些文件原則上應(yīng)該和容器具體信息以及主機信息完全解藕。那么 Docker 容器中不存在 Docker 鏡像中的內(nèi)容主要有以下幾點:

1./proc 以及 /sys 等虛擬文件系統(tǒng)的內(nèi)容

2. 容器的 hosts 文件,hostname 文件以及 resolv.conf 文件,這些事具體環(huán)境的信息,原則上的確不應(yīng)該被打入鏡像。

3. 容器的 Volume 路徑,這部分的視角來源于從宿主機上掛載到容器內(nèi)部的路徑

4. 部分的設(shè)備文件

到此,關(guān)于“Dockerfile、Docker 鏡像和容器的關(guān)系是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-08-16發(fā)表,共計2658字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 庆云县| 潼南县| 鹤山市| 军事| 民勤县| 宁强县| 台东县| 淳安县| 晋州市| 喀什市| 漯河市| 齐河县| 丽水市| 怀宁县| 文成县| 刚察县| 武威市| 邵武市| 修水县| 抚宁县| 策勒县| 长宁区| 红原县| 固阳县| 汝城县| 兴和县| 肥城市| 天峨县| 上虞市| 攀枝花市| 涞水县| 五莲县| 长宁区| 伊通| 印江| 贞丰县| 上饶县| 台山市| 呈贡县| 大方县| 肃南|