需求背景
拿到一个 Docker 镜像之后,排查和优化通常会先问三个问题:
- 分层查看镜像里都有哪些文件
- 各层使用了什么命令构建的这个镜像
- 镜像里比较大的文件有哪些(可能需要优化)
这些问题只靠 docker images 或 docker history 很难看清楚。docker history 能看到构建历史,但不方便按层浏览文件变化;直接进入容器查看文件,又很难知道文件来自哪一层。dive 适合补上这块信息。
dive 工具介绍
dive 工具可以分析镜像分层。dive 的 GitHub 地址是 wagoodman/dive,采用 MIT 开源协议。它的介绍是这么一句话:
A tool for exploring each layer in a docker image
也就是说,它的定位不是运行容器,而是帮助你理解镜像每一层发生了什么。
其分析效果大概如下:

用 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 等开源项目的创始人,当前在创业,为客户提供可观测性相关的产品。如下是我们两款核心产品,欢迎访问我们的官网了解详情:
我们主要提供两款产品:

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

扩展阅读:
