Dive分析鏡像的神器

dive 簡(jiǎn)介

diev:用于探索 docker 鏡像層內(nèi)容以及發(fā)現(xiàn)減小 docker 鏡像大小的方法工具谷浅。

docker 命令分析鏡像

  • docker inspect 查看鏡像的 Metadata 信息温赔,例如:
# 下載一個(gè)示例鏡像
$ docker pull registry.cn-shanghai.aliyuncs.com/wuhepeng/my-alpine:3.20
# 查看示例鏡像信息
$ docker inspect registry.cn-shanghai.aliyuncs.com/wuhepeng/my-alpine:3.20

返回如下(已省略部分信息)腋逆,重點(diǎn)觀察 RootFS/Layers的內(nèi)容:

[
    {
        "Id": "sha256:414515225ebb195d95ab127204b020ba5ec29ddd5afec91d940302d45f314027",
        "RepoTags": [
            "registry.cn-shanghai.aliyuncs.com/wuhepeng/my-alpine:3.20"
        ],
        "RepoDigests": [
            "registry.cn-shanghai.aliyuncs.com/wuhepeng/my-alpine@sha256:61a4e416962b4c72d3e6b797c9b85922d4cc648093b0acb792affdbd4d27ccc4"
        ],
        "Parent": "",
        "Comment": "buildkit.dockerfile.v0",
        "Created": "2024-09-10T10:01:22.692301657Z",
        "Container": "",
        "ContainerConfig": {
        },
        "DockerVersion": "",
        "Author": "",
        "Config": {
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 15579326,
        "VirtualSize": 15579326,
        "GraphDriver": {
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:63ca1fbb43ae5034640e5e6cb3e083e05c290072c5366fcaa9d62435a4cced85",
                "sha256:a1ae8c736202d119a140341e134ac08b99f103a29b15163cf272b286b762d104"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]
  • docker history 查看鏡像構(gòu)建層命令
# 可以通過(guò)添加 --no-trunc 參數(shù)顯示每層詳細(xì)構(gòu)建命令
$ docker history registry.cn-shanghai.aliyuncs.com/wuhepeng/my-alpine:3.20
    IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
414515225ebb        42 hours ago        CMD ["/bin/sh"]                                 0B                  buildkit.dockerfile.v0
<missing>           42 hours ago        RUN /bin/sh -c apk update && apk add --no-ca…   7.78MB              buildkit.dockerfile.v0
<missing>           5 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B
<missing>           5 weeks ago         /bin/sh -c #(nop) ADD file:5758b97d8301c84a2…   7.8MB
  • 總結(jié):雖然docker提供 docker inspectdocker history 兩個(gè)命令查詢(xún)鏡像構(gòu)建歷史信息贯钩,但是這些信息對(duì)我們?nèi)シ治鲆粋€(gè)鏡像的具體每一層的組成來(lái)說(shuō)還是不太夠铭段,不夠清晰明了。下面通過(guò) dive 工具來(lái)分析詳細(xì)的每層信息隅很。

dive 結(jié)果展示

使用以下命令進(jìn)行dive分析:

$ dive registry.cn-shanghai.aliyuncs.com/wuhepeng/my-alpine:3.20
dive結(jié)果

可以看到,當(dāng)你運(yùn)行 dive 時(shí),它會(huì)顯示一個(gè)界面叔营,主要包括以下幾個(gè)區(qū)域:

  • 鏡像層次結(jié)構(gòu)(左側(cè)Layers和Layer Details):顯示了鏡像的所有層屋彪,每一層是由一個(gè) Docker 指令生成的(如 ADD、COPY绒尊、RUN 等)畜挥。你可以看到每層的大小,以及該層對(duì)整個(gè)鏡像的影響婴谱。

  • 文件系統(tǒng)變化(右側(cè)Current Layer Contents):顯示在當(dāng)前層中蟹但,哪些文件被添加、修改或刪除谭羔。每個(gè)文件/目錄前面會(huì)有標(biāo)記华糖,如:
    A 表示新增的文件。
    C 表示修改的文件瘟裸。
    D 表示刪除的文件客叉。

  • 空間利用率(左下Image Details):展示了在鏡像層中哪些文件實(shí)際被使用,哪些是未被使用的文件(即在后續(xù)層中被刪除或覆蓋)话告。這有助于你識(shí)別浪費(fèi)的空間兼搏。同時(shí)有效率分?jǐn)?shù),越高的分?jǐn)?shù)意味著鏡像越優(yōu)化沙郭,浪費(fèi)的空間越少向族。

dive 基本功能

  • 按層顯示Docker鏡像內(nèi)容:在左側(cè)選擇一個(gè)圖層時(shí),將顯示該圖層的內(nèi)容以及右側(cè)的所有先前圖層棠绘。此外件相,您還可以使用箭頭鍵全面瀏覽文件樹(shù)。

  • 指出每一層的變化:文件樹(shù)中指示已更改氧苍,修改夜矗,添加或刪除的文件∪门埃可以對(duì)其進(jìn)行調(diào)整以顯示特定層的更改紊撕,或顯示直到該層的匯總更改

  • 估計(jì)“圖像效率”:左下方的窗格顯示基本圖層信息和實(shí)驗(yàn)指標(biāo),該指標(biāo)將猜測(cè)圖像所包含的浪費(fèi)空間赡突。這可能是由于跨層復(fù)制文件对扶,跨層移動(dòng)文件或沒(méi)有完全刪除文件。提供百分比“得分”和總浪費(fèi)文件空間惭缰。

  • 快速的構(gòu)建/分析周期:您可以構(gòu)建一個(gè)Docker鏡像并使用以下命令立即進(jìn)行分析:dive build -t some-tag .浪南。您只需要用docker build 相同的 dive build 命令替換命令即可。

支持多個(gè)鏡像源和容器引擎

使用該 --source 選項(xiàng)漱受,您可以選擇從何處獲取容器圖像:
dive <your-image> --source <source>dive <source>://<your-image>
source 選項(xiàng)支持:

  • docker:Docker引擎(默認(rèn)選項(xiàng))
  • docker-archive:來(lái)自磁盤(pán)的 Docker Tar 存檔
  • podman:Podman引擎(僅Linux)

安裝

Ubuntu/Debian

DIVE_VERSION=$(curl -sL "https://api.github.com/repos/wagoodman/dive/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
curl -OL https://github.com/wagoodman/dive/releases/download/v${DIVE_VERSION}/dive_${DIVE_VERSION}_linux_amd64.deb
sudo apt install ./dive_${DIVE_VERSION}_linux_amd64.deb

RHEL/Centos

DIVE_VERSION=$(curl -sL "https://api.github.com/repos/wagoodman/dive/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
curl -OL https://github.com/wagoodman/dive/releases/download/v${DIVE_VERSION}/dive_${DIVE_VERSION}_linux_amd64.rpm
rpm -i dive_${DIVE_VERSION}_linux_amd64.rpm

Mac

$ brew install dive
或
$ sudo port install dive

Docker 運(yùn)行

# 使用該鏡像運(yùn)行一個(gè)臨時(shí)的容器络凿,加上我們需要分析的鏡像
$ docker run --rm -it \
    -v /var/run/docker.sock:/var/run/docker.sock \
    wagoodman/dive:latest <dive arguments...>

按鍵綁定

按鍵綁定 描述
Ctrl + C 退出
Tab 在層和文件樹(shù)視圖之間切換
Ctrl + F 篩選
PageUp 向上滾動(dòng)頁(yè)面
PageDown 向下滾動(dòng)頁(yè)面
Ctrl + A 鏡像視圖:查看聚合圖像修改
Ctrl + L 鏡像視圖:查看當(dāng)前圖層修改
Space 文件樹(shù)視圖:折疊/取消折疊目錄
Ctrl + Space 文件樹(shù)視圖:折疊/展開(kāi)所有目錄
Ctrl + A 文件樹(shù)視圖:顯示/隱藏添加的文件
Ctrl + R 文件樹(shù)視圖:顯示/隱藏已刪除的文件
Ctrl + M 文件樹(shù)視圖:顯示/隱藏修改的文件
Ctrl + U 文件樹(shù)視圖:顯示/隱藏未修改的文件
Ctrl + B 文件樹(shù)視圖:顯示/隱藏文件屬性
PageUp Filetree視圖:向上滾動(dòng)頁(yè)面
PageDown Filetree視圖:向下滾動(dòng)頁(yè)面

項(xiàng)目地址

參考鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子絮记,更是在濱河造成了極大的恐慌摔踱,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怨愤,死亡現(xiàn)場(chǎng)離奇詭異派敷,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)撰洗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)篮愉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人了赵,你說(shuō)我怎么就攤上這事〉樵撸” “怎么了柿汛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)埠对。 經(jīng)常有香客問(wèn)我络断,道長(zhǎng),這世上最難降的妖魔是什么项玛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任貌笨,我火速辦了婚禮,結(jié)果婚禮上襟沮,老公的妹妹穿的比我還像新娘锥惋。我一直安慰自己,他們只是感情好开伏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布膀跌。 她就那樣靜靜地躺著,像睡著了一般固灵。 火紅的嫁衣襯著肌膚如雪捅伤。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天巫玻,我揣著相機(jī)與錄音丛忆,去河邊找鬼。 笑死仍秤,一個(gè)胖子當(dāng)著我的面吹牛熄诡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诗力,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼粮彤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起导坟,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤屿良,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后惫周,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體尘惧,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年递递,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喷橙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡登舞,死狀恐怖贰逾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情菠秒,我是刑警寧澤疙剑,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站践叠,受9級(jí)特大地震影響言缤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜禁灼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一管挟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弄捕,春花似錦僻孝、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至分飞,卻和暖如春悴务,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背譬猫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工讯檐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人染服。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓别洪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親柳刮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挖垛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容