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 inspect
和docker 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
可以看到,當(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è)面 |