Dive Docker 镜像层分析工具教程
Docker 镜像由多个层(Layer)叠加组成,每一层对应 Dockerfile 中的一条指令。如果不仔细优化,镜像中可能包含大量不必要的文件,导致体积膨胀。Dive 是一款专门用于探索和分析 Docker 镜像层的终端工具,它能直观地展示每一层的内容变化,帮助你发现镜像中浪费的空间并进行优化。本文介绍如何在搬瓦工 VPS 上安装和使用 Dive。
一、安装 Dive
1.1 下载二进制文件
DIVE_VERSION=$(curl -s https://api.github.com/repos/wagoodman/dive/releases/latest | grep -Po '"tag_name": "v\K[^"]*')
curl -Lo dive.deb "https://github.com/wagoodman/dive/releases/download/v${DIVE_VERSION}/dive_${DIVE_VERSION}_linux_amd64.deb"
dpkg -i dive.deb
rm dive.deb
# 验证安装
dive --version
1.2 通过 Docker 运行
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
wagoodman/dive:latest myimage:tag
二、基本使用
# 分析本地镜像
dive nginx:latest
# 分析并构建镜像(一步完成)
dive build -t myapp:latest .
# 分析远程镜像(无需先拉取)
dive docker.io/library/nginx:latest
三、界面操作
Dive 的界面分为左右两个面板:
- 左侧面板:显示镜像的所有层,每一层对应 Dockerfile 中的一条指令。
- 右侧面板:显示选中层的文件系统变化(新增、修改、删除的文件)。
常用快捷键:
Tab:在左右面板之间切换。↑/↓:在层列表或文件列表中移动。Space:展开/折叠文件目录树。Ctrl+A:切换显示所有文件或仅显示变化的文件。Ctrl+U:只显示没有变化的文件(找出可能不需要的文件)。Ctrl+L:切换层聚合模式。q:退出 Dive。
四、分析镜像效率
Dive 界面底部会显示镜像效率评分:
- Image Efficiency:镜像效率百分比,越高越好。
- Potential Wasted Space:可能浪费的空间大小。
常见的空间浪费包括:
- 在一层中安装包,在后面的层中删除(删除不会减小镜像大小)。
- 包管理器缓存文件没有在同一层中清除。
- 复制了不需要的源代码或开发工具。
五、CI/CD 集成
Dive 支持非交互模式,可以在 CI/CD 流水线中自动检查镜像质量:
# 使用 CI 模式分析镜像
CI=true dive myapp:latest
# 设置效率阈值(低于阈值则构建失败)
CI=true dive myapp:latest --highestUserWastedPercent 0.1 --highestWastedBytes 50MB --lowestEfficiency 0.95
配置文件 .dive-ci 可以放在项目根目录:
cat > .dive-ci <<'EOF'
rules:
lowestEfficiency: 0.95
highestWastedBytes: 50MB
highestUserWastedPercent: 0.10
EOF
六、优化实践案例
使用 Dive 发现问题后,对照修改 Dockerfile:
# 优化前(Dive 显示 apt 缓存占用 100MB+)
FROM debian:bookworm-slim
RUN apt-get update
RUN apt-get install -y curl nginx
RUN apt-get clean
# 优化后(合并指令,同一层清除缓存)
FROM debian:bookworm-slim
RUN apt-get update && \
apt-get install -y --no-install-recommends curl nginx && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
# 优化前后对比
dive build -t myapp:before -f Dockerfile.before .
dive build -t myapp:after -f Dockerfile.after .
docker images | grep myapp
七、常见问题
Dive 无法连接 Docker
# 确认 Docker 正在运行
systemctl status docker
# 确认有权限访问 Docker Socket
ls -la /var/run/docker.sock
分析大镜像时内存不足
在搬瓦工小内存方案上分析大镜像可能内存不足,可以使用 --source docker-archive 模式减少内存占用:
docker save myimage:tag -o /tmp/image.tar
dive --source docker-archive /tmp/image.tar
总结
Dive 是优化 Docker 镜像的得力工具,它能直观地揭示镜像中每一层的内容和浪费的空间。建议在每次构建镜像后用 Dive 进行检查,结合 Dockerfile 最佳实践 和 多阶段构建 持续优化。Dockerfile 的语法检查可以使用 Hadolint,安全漏洞扫描可以使用 Trivy。选购搬瓦工 VPS 请访问 bwh81.net,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣。