5 分钟小工具:使用 dive 分析 docker 镜像

dive 是一个用于分析 Docker 镜像分层、构建命令和大文件占用的开源工具。本文说明它适合解决哪些镜像分析问题,并给出 Docker 方式和二进制方式的安装使用示例。

作者 巴辉特

需求背景

拿到一个 Docker 镜像之后,排查和优化通常会先问三个问题:

  • 分层查看镜像里都有哪些文件
  • 各层使用了什么命令构建的这个镜像
  • 镜像里比较大的文件有哪些(可能需要优化)

这些问题只靠 docker imagesdocker history 很难看清楚。docker history 能看到构建历史,但不方便按层浏览文件变化;直接进入容器查看文件,又很难知道文件来自哪一层。dive 适合补上这块信息。

dive 工具介绍

dive 工具可以分析镜像分层。dive 的 GitHub 地址是 wagoodman/dive,采用 MIT 开源协议。它的介绍是这么一句话:

A tool for exploring each layer in a docker image

也就是说,它的定位不是运行容器,而是帮助你理解镜像每一层发生了什么。

其分析效果大概如下:

docker-dive-demo

用 dive 打开镜像后,通常可以看到这些信息:

信息 用途
镜像分层 判断每一层由哪个 Dockerfile 指令生成
文件树变化 查看某一层新增、修改、删除了哪些文件
大文件提示 找出可能需要清理或拆分的文件
镜像评分 快速判断镜像是否存在明显浪费

安装 dive

可以使用镜像方式运行:

docker pull wagoodman/dive:latest
docker run --rm -it -v /var/run/docker.sock:/var/run/docker.sock wagoodman/dive:latest <your_image>

也可以使用二进制方式安装:

  • 下载地址:https://github.com/wagoodman/dive/releases
  • 最新版本:v0.12.0

下载之后解压,里面只有一个二进制文件,直接使用即可。比如分析夜莺的镜像:

./dive flashcatcloud/nightingale:latest

按键盘上面的上下移动键,即可查看不同分层的信息。右侧会展示当前分层的文件,左侧中间位置展示当前分层的详情,底部展示镜像评分,并提示一些可能需要关注的大文件。

什么时候应该用 dive

dive 适合这些场景:

  • 镜像体积异常变大,需要找出新增大文件。
  • Dockerfile 多次复制、安装、删除文件,想确认最终层是否还有残留。
  • 基础镜像升级后,想比较镜像层变化。
  • 接手别人构建的镜像,需要快速理解里面有什么。

它不替代镜像安全扫描工具,也不替代 SBOM 或漏洞分析工具。dive 更关注镜像结构和文件体积,而不是判断依赖是否存在漏洞。

FAQ

Q1:dive 需要启动容器吗? 不需要。它分析的是镜像层,不是运行中的容器状态。

Q2:为什么要挂载 /var/run/docker.sock 使用容器方式运行 dive 时,它需要通过 Docker Socket 读取本机 Docker 镜像信息,所以示例里挂载了 /var/run/docker.sock

Q3:dive 能直接告诉我怎么优化 Dockerfile 吗? 它能指出分层和大文件问题,但具体优化方式仍要结合 Dockerfile。常见做法包括减少无用文件、合并安装清理步骤、使用更小基础镜像和合理利用多阶段构建。

enjoy :-)


本公众号主理人:秦晓辉,极客时间《运维监控系统实战笔记》作者,Open-Falcon、夜莺、Categraf、Cprobe 等开源项目的创始人,当前在创业,为客户提供可观测性相关的产品。如下是我们两款核心产品,欢迎访问我们的官网了解详情:

我们主要提供两款产品:

5 分钟小工具:使用 dive 分析 docker 镜像 - 图1

欢迎加我好友,交流可观测性相关话题或了解我们的商业产品,如下是我的联系方式,加好友请备注您的公司、姓名、来意 🤝

5 分钟小工具:使用 dive 分析 docker 镜像 - 图2

扩展阅读:

联系我们交流

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

标签 Docker
快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云