溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何分析Docker文件系統(tǒng)

發(fā)布時(shí)間:2021-12-01 17:08:34 來(lái)源:億速云 閱讀:196 作者:柒染 欄目:云計(jì)算

這篇文章將為大家詳細(xì)講解有關(guān)如何分析Docker文件系統(tǒng),文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

我們來(lái)實(shí)戰(zhàn)構(gòu)建一個(gè)Docker鏡像,然后實(shí)例化容器,在Docker的生命周期中詳細(xì)分析一下Docker的文件存儲(chǔ)情況和DockerFile優(yōu)化策略。

如何分析Docker文件系統(tǒng)

在開(kāi)始實(shí)戰(zhàn)之前,我們先介紹一個(gè)概念,聯(lián)合文件系統(tǒng)(Union File System)。聯(lián)合文件系統(tǒng)是實(shí)現(xiàn)Docker鏡像的技術(shù)基礎(chǔ),支持對(duì)文件系統(tǒng)的修改作為一次提交來(lái)一層層的疊加,同時(shí)可以將不同目錄掛載到同一個(gè)虛擬文件系統(tǒng)下。鏡像的分層存儲(chǔ)和繼承就是基于此特性實(shí)現(xiàn)。

下面是Docker官方的一張描述文件系統(tǒng)的圖片,顯示了一張聯(lián)合文件系統(tǒng)在串聯(lián)鏡像層和容器層起到的作用

如何分析Docker文件系統(tǒng)

Docker支持多種聯(lián)合文件系統(tǒng),常見(jiàn)的有aufs,deviceMapper,overlay,overlay2,本文章中使用的系統(tǒng)版本為debian9.1,Docker版本為17.06.2-ce,默認(rèn)使用是overlay2。

    看到這里如果你已經(jīng)對(duì)Docker文件系統(tǒng)有了簡(jiǎn)單的概念,那么讓我們開(kāi)始實(shí)戰(zhàn),來(lái)對(duì)分層文件系統(tǒng)的存儲(chǔ)方式進(jìn)行更加深入的了解。

鏡像層

這是一個(gè)云信私有化項(xiàng)目中基于debian系統(tǒng)鏡像創(chuàng)建的jdk8基礎(chǔ)鏡像,為了方便閱讀和分析,我們Dockerfile進(jìn)行了一些精簡(jiǎn),只保留核心部分內(nèi)容

FROM hub.c.163.com/library/debian:stretch

MAINTAINER nim

#下載jdk

ADD http://10.173.11.100/nim/jdk-8u202-linux-x64.tar.gz /usr/local/nim/

#解壓jdk并刪除

RUN tar -xzvf /usr/local/nim/jdk-8u202-linux-x64.tar.gz -C /usr/local/nim/ \

&& rm /usr/local/nim/jdk-8u202-linux-x64.tar.gz

#設(shè)置環(huán)境變量

ENV JAVA_HOME=/usr/local/nim/jdk1.8.0_202

ENV PATH=$JAVA_HOME/bin:$PATH

CMD ["/bin/bash"]

根據(jù)構(gòu)建鏡像,查看構(gòu)建結(jié)果,原基礎(chǔ)鏡像100M,構(gòu)建后鏡像體積697M。

如何分析Docker文件系統(tǒng)

鏡像存儲(chǔ)

    現(xiàn)在開(kāi)始看一下構(gòu)建鏡像工作在文件層存儲(chǔ)情況。首先我們使用Docker history查看一下剛剛構(gòu)建鏡像情況,可以看到基礎(chǔ)鏡像占用100M,兩個(gè)鏡像分層占用194MB和403M。

如何分析Docker文件系統(tǒng)

接下來(lái)我們看查看一下文件系統(tǒng)中的存儲(chǔ)情況,本環(huán)境使用overlay2,Docker鏡像層存儲(chǔ)默認(rèn)路徑為/var/lib/Docker/overlay2/,可以看到鏡像存儲(chǔ)目錄下有4個(gè)目錄,其中110M的對(duì)應(yīng)是基礎(chǔ)鏡像,另外兩個(gè)為ADD JDK(186M)和解壓JDK壓縮包的鏡像分層(389M)。

如何分析Docker文件系統(tǒng)

其中的l目錄包含了所有層的軟連接,軟鏈接使用短名稱,避免mount時(shí)候參數(shù)達(dá)到頁(yè)面大小限制。

如何分析Docker文件系統(tǒng)

下面我們了解一下,每個(gè)分層中的文件內(nèi)容?;A(chǔ)鏡像分層包含diff文件夾和link文件,diff文件夾中存放當(dāng)前分層內(nèi)容,link文件記錄短名稱。

如何分析Docker文件系統(tǒng)

接下來(lái)看一下COPY JDK生成的內(nèi)容,diff文件夾保存了jdk壓縮包,本層相比基礎(chǔ)鏡像層,多了lower,merged,work三個(gè)文件/文件夾,其中l(wèi)ower記錄了此層的下層ID(基礎(chǔ)鏡像層),merged目錄作為提供了統(tǒng)一視圖,在容器層讀寫(xiě)層被使用,work目錄用于聯(lián)合掛載指定的工作目錄,使用過(guò)程對(duì)用戶不可見(jiàn)。

如何分析Docker文件系統(tǒng)

解壓JDK層的文件夾結(jié)構(gòu)內(nèi)容和上一層類似,主要關(guān)注jdk壓縮包占用空間為0,表示已被刪除。

如何分析Docker文件系統(tǒng)

現(xiàn)在來(lái)重點(diǎn)關(guān)注一個(gè)問(wèn)題,鏡像大小等于所有分層相加,在后續(xù)分層中被刪除的jdk壓縮包仍然要占用存儲(chǔ)空間,這并不是我們?cè)疽鈭D,因此這里就出現(xiàn)了鏡像文件進(jìn)行優(yōu)化的點(diǎn)。優(yōu)化后的Dockerfile如下

FROM hub.c.163.com/library/debian:stretch

MAINTAINER nim

RUN curl -o /usr/local/nim/jdk-8u202-linux-x64.tar.gz http://10.173.11.100/nim/jdk-8u202-linux-x64.tar.gz \

&& tar -xzvf /usr/local/nim/jdk-8u202-linux-x64.tar.gz -C /usr/local/nim/ \

&& rm /usr/local/nim/jdk-8u202-linux-x64.tar.gz \

&& export JAVA_HOME=/usr/local/nim/jdk1.8.0_202 \

&& export PATH=$JAVA_HOME/bin:$PATH

CMD ["/bin/bash"]

借這個(gè)優(yōu)化后的內(nèi)容,我們?cè)僬勔幌聵?gòu)建Docker鏡像時(shí)在時(shí)間和空間可優(yōu)化的點(diǎn)

  1. 組合運(yùn)行語(yǔ)句:合并相同類型構(gòu)建語(yǔ)句,可以有效減少鏡像分層;

  2. 利用鏡像構(gòu)建緩存:時(shí)間同步,基礎(chǔ)軟件安裝等固定內(nèi)容在鏡像前部分處理,鏡像重新構(gòu)建時(shí)會(huì)使用緩存,節(jié)省時(shí)間;

  3. 清理中間產(chǎn)物:注意安裝過(guò)程中使用的軟件和壓縮包在一定要同一層里清理,否則仍然會(huì)占用鏡像空間;

  4. 構(gòu)建語(yǔ)句優(yōu)化:比如ADD在處理本地文件時(shí)可以直接解壓縮,起到COPY + RUN tar的作用;

  5. 優(yōu)化基礎(chǔ)鏡像源:國(guó)內(nèi)高校和大型IT企業(yè)都有創(chuàng)建鏡像站,選擇一個(gè)穩(wěn)定更新及時(shí)的鏡像站可以有效縮短構(gòu)建時(shí)間;

舉例的鏡像中優(yōu)化策略涉及1,3條,用curl替代add,與解壓和刪除合并為一層,Dockerfile減少了層數(shù),清理中間過(guò)程的jdk安裝包,下圖是優(yōu)化后鏡像體積變化:

如何分析Docker文件系統(tǒng)

    構(gòu)建鏡像真的是層數(shù)越少越好嗎?當(dāng)然不是這么絕對(duì),尤其在早期鏡像版本不是很穩(wěn)定或是后續(xù)迭代比較頻繁時(shí),合理的鏡像分層會(huì)減少編譯時(shí)間,降低出錯(cuò)概率,也可以讓Dockerfile更具有可讀性??梢栽俜€(wěn)定版本形成之后對(duì)鏡像進(jìn)行二次優(yōu)化。

鏡像元數(shù)據(jù)

分析一個(gè)鏡像元數(shù)據(jù)我們主要關(guān)注三個(gè)目錄

/var/lib/Docker/image/overlay2/imaged/

/var/lib/Docker/image/overlay2/layerdb/

/var/lib/Docker/overlay2/

第一個(gè)目錄保存鏡像基礎(chǔ)元數(shù)據(jù),第二個(gè)目錄保存鏡像分層元數(shù)據(jù),第三個(gè)是上文提到的分層存儲(chǔ)目錄,保存實(shí)際分層內(nèi)容。下面就根據(jù)實(shí)際情況來(lái)看一下,元數(shù)據(jù)與存儲(chǔ)信息是如何關(guān)聯(lián)起來(lái)的。

Docker鏡像的基本信息保存在/var/lib/Docker/image/overlay2/imaged/content/sha256/下面,可以根據(jù)Docker image ID在此目錄下查找到對(duì)應(yīng)ID開(kāi)頭文件。此文件中以json的形式保存了該鏡像的分層文件系統(tǒng)、構(gòu)建信息、相關(guān)容器等內(nèi)容。

如何分析Docker文件系統(tǒng)

第二個(gè)目錄/var/lib/Docker/image/overlay2/layerdb/sha256/保存分層元數(shù)據(jù),每一個(gè)分層元數(shù)據(jù)目錄下有cache-id,diff,size信息,其中cache-id對(duì)應(yīng)分層存儲(chǔ)層,diff關(guān)聯(lián)鏡像基礎(chǔ)元數(shù)據(jù)信息。

如何分析Docker文件系統(tǒng)

如何分析Docker文件系統(tǒng)

如何分析Docker文件系統(tǒng)

容器層

首先我們來(lái)啟動(dòng)一個(gè)容器,掛載宿主機(jī)/opt/yunxin目錄到容器/usr/local/yunxin目錄

如何分析Docker文件系統(tǒng)

創(chuàng)建容器完成之后,在鏡像存儲(chǔ)目錄/var/lib/Docker/overlay2/會(huì)生成容器的初始層和讀寫(xiě)層,兩者使用相同標(biāo)識(shí),初始層后面多了-init。初始層中主要保存初始化容器環(huán)境時(shí),與容器相關(guān)的環(huán)境信息,如容器主機(jī)名,主機(jī)host信息以及域名服務(wù)文件等;讀寫(xiě)層用于容器的讀寫(xiě),Docker容器內(nèi)的進(jìn)程只對(duì)讀寫(xiě)層擁有寫(xiě)權(quán)限,而對(duì)其他層文件內(nèi)容只擁有讀權(quán)限。

如何分析Docker文件系統(tǒng)

接下來(lái)我們進(jìn)入容器操作進(jìn)行一系列操作,再根據(jù)結(jié)果分析一下讀寫(xiě)層對(duì)于文件的保存和處理,下面是操作和對(duì)應(yīng)結(jié)果以及讀寫(xiě)層實(shí)際文件存儲(chǔ)情況。

序號(hào)

類  型

操    作

表 現(xiàn)

1

寫(xiě)入新文件

寫(xiě)入/root/container_file.txt

寫(xiě)入讀寫(xiě)層

2

掛載目錄寫(xiě)入新文件

寫(xiě)入/usr/local/yunxin/mount_file.txt

不寫(xiě)入讀寫(xiě)層,僅保存在掛載目錄

3

修改鏡像原有文件

修改

/usr/local/nim/jdk1.8.0_202/THIRDPARTYLICENSEREADME.txt

寫(xiě)入讀寫(xiě)層

4

刪除鏡像原有文件

刪除

/usr/local/nim/jdk1.8.0_202/README.html

保存在讀寫(xiě)層

如何分析Docker文件系統(tǒng)

讀寫(xiě)層中的merged文件夾提供了統(tǒng)一視圖,面向用戶展示聯(lián)合文件系統(tǒng)掛載完成的最終形態(tài)。

如何分析Docker文件系統(tǒng)

接下來(lái)我們?cè)倩谕粋€(gè)鏡像啟動(dòng)幾個(gè)容器實(shí)例,然后來(lái)查詢一下Docker容器使用空間,只有第一個(gè)容器由于上面修改文件只占用154k,新啟動(dòng)的容器并沒(méi)有額外占用空間??梢?jiàn)基于同一個(gè)鏡像創(chuàng)建容器時(shí),所有的容器共享鏡像層內(nèi)容,有效節(jié)約了空間。讀寫(xiě)層只保存修改內(nèi)容,如果是操作鏡像層文件,Docker采用的是修改時(shí)復(fù)制策略(copy-on-write)。這時(shí)回頭再看一下第一節(jié)出現(xiàn)的兩張圖,會(huì)對(duì)Docker的文件系統(tǒng)有了更深的體會(huì)。

如何分析Docker文件系統(tǒng)

Docker 鏡像和容器文件系統(tǒng)相關(guān)知識(shí)在云信私有化產(chǎn)品的鏡像管理和運(yùn)維存儲(chǔ)管理方面作出理論支撐,但這只是深入了解Docker的開(kāi)始。隨著時(shí)間的積淀和云信旗下IM、音視頻、點(diǎn)播以及眾多相關(guān)產(chǎn)品私有化工作的深入,更多的模塊和鏡像,更多的客戶和需求,更復(fù)雜的網(wǎng)絡(luò)和環(huán)境都逐漸呈現(xiàn)在我們面前。Docker作為構(gòu)建云信私有化服務(wù)的基礎(chǔ),只有更深入的去了解原理才能在使用中去更好的優(yōu)化產(chǎn)品和開(kāi)展運(yùn)維。希望我們能為用戶提供更可靠的云信私有化服務(wù),也希望能在后續(xù)的文章中能與大家分享更多關(guān)于Docker的知識(shí)。

關(guān)于如何分析Docker文件系統(tǒng)就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI