前言:你的 Docker 镜像有多大、容器在吃什么资源,你真的清楚吗?
上周帮一个朋友排查 CI 构建慢的问题。他一个 Spring Boot 应用的 Docker 镜像,愣是 1.8GB。push 一次等 8 分钟,pull 一次再等 4 分钟,一个周五下午全耗在等构建上。我问:你知道哪层最大吗?他说不知道。你检查过运行中的容器 CPU 内存占用吗?他说用 docker stats 看两眼。你优化过镜像层数吗?他沉默了三秒——「docker 还要优化?」

这个场景太典型了。大部分人用 Docker 就是 docker build && docker run,然后不管了。但容器化上生产之后,镜像膨胀、资源泄漏、层数爆炸——这些坑是一个接一个。好在社区有了一套完整的工具链,覆盖「构建→诊断→优化→监控」全流程。
这篇评测覆盖 6 个工具:Dive、hadolint、docker-slim、ctop、lazydocker、dry。评测版本和日期见下方概览表。每个工具我会给实际使用体验、最佳场景和槽点。不是泛泛的「10个必备工具」列表——每个工具我都踩过坑,有些甚至吃过亏才学会用对。
工具概览
| 维度 | Dive | hadolint | docker-slim | ctop | lazydocker | dry |
|---|---|---|---|---|---|---|
| 定位 | 镜像层分析 | Dockerfile 静态检测 | 镜像瘦身 | 容器资源监控 | 容器管理 TUI | 容器管理 CLI |
| 发布时间 | 2017 | 2016 | 2016 | 2017 | 2019 | 2018 |
| 评测版本 | 0.12 | 2.12 | 1.40 | 1.0.1 | 0.19 | 0.9-beta |
| 安装方式 | brew / 下载 binary | brew / cargo / Docker | brew / binary | brew / binary | brew / go install | brew / binary |
| 交互方式 | TUI + JSON 输出 | CLI(lint 报告) | CLI | TUI | TUI(全屏) | TUI(半屏) |
| 许可证 | MIT | GPLv3 | Apache 2.0 | MIT | MIT | MIT |
这 6 个工具覆盖了容器化流程的 4 个阶段:构建前检查(hadolint)、镜像诊断(Dive)、镜像优化(docker-slim)、运行监控与管理(ctop / lazydocker / dry)。互补不重叠,串起来用就是一条完整的 Docker 容器化管理工具链。
逐个深度评测
Dive — 镜像层分析王者
亮点: Dive 能让你「看见」Docker 镜像的每一层。它把镜像层拆开,左边是每层的文件变化,右边是该层的文件系统快照。最值钱的功能是 CI/CD 集成——Dive 支持 JSON 输出,你可以设置阈值:镜像效率低于某个百分比就拒绝通过。我用它发现过最离谱的事:一个 Python 镜像里竟然缓存了 300MB 的 pip build 中间文件,就因为它没按官方推荐的分层写 requirements。
不足: 第一次用会有些困惑——它的界面交互是上下左右选的,但默认不显示帮助栏。另外分析大镜像(>2GB)第一次加载略慢(30秒左右)。
最佳场景: CI gate + 每隔两个月扫一次生产镜像看有没有膨胀。
hadolint — Dockerfile 纠察队
亮点: hadolint 是 Dockerfile 的 lint 工具。它不只是检查格式,还会检查安全性。比如某个 RUN 命令没加 –no-cache 或没清理 apt-get 缓存——它直接报错。它的规则级别分 info/warning/error,很多严重度高的 warning 在 CI 里就该阻断构建。我最喜欢的是 DL3059 规则——它会发现你用连续多个 RUN 而不是一个 RUN 链起来。一个小团队改了这条规则后,我们最终层数从 42 层降到了 11 层。
不足: 规则有点严苛。有些生产上不得不用的写法(比如 multi-stage build 中的 COPY –from)它会警告。建议项目初期就接入,后期加 lint 会有一堆历史违规要追。
最佳场景: pre-commit hook + CI pipeline gate。
docker-slim — 镜像瘦身魔术师
亮点: docker-slim 能自动化地把镜像「榨干」。原理是用静态分析 + 动态追踪找到容器实际需要的文件和动态链接库,剔除掉所有没用到的东西。我之前一个 Go 编译后的镜像,原版 280MB,docker-slim 一跑压缩到 12MB——减少了 96%。并且它内置 --http-probe 功能,启动容器后自动探测端口和路由,确保瘦身后的镜像行为正常。
不足: 动态探测模式下需要启动容器,意味着你需要有运行该容器的环境。而且第一次执行时间比较长(5-15 分钟取决于镜像复杂度)。非英语环境的某些路径依赖它有可能 miss(比如中文路径)。
最佳场景: 发布前的最后一步优化,尤其适合 Java/Python/Node 这类基础镜像几百 MB 的运行时。
ctop — 写个命令就能看的 docker top
亮点: ctop 就是容器的 top。你不需要登录任何监控平台——开一个终端,敲 ctop,每个容器的 CPU%、内存、网络 I/O 一目了然。支持按资源排序、容器过滤、log 快捷键查看。我个人最喜欢的是:某个容器内存飙到 90%+ 时,ctop 的颜色会从绿变黄再变红,一眼就能识别异常。
不足: 功能有限。它只看当前实时数据,不能看历史趋势。另外如果你有超过 50 个容器,ctop 默认视图太密了,需要提前配好过滤器。也没有告警机制——这本来就不该是个独立监控工具。
最佳场景: 开发环境 + 生产环境的快速 glance——「我 SSH 上机器了,让我看下当前是什么 in 一个命令」。
lazydocker — 懒人神器,一个 TUI 搞定一切
亮点: lazydocker 是目前最好的 Docker TUI 工具,没有之一。启动后你看到一个分屏界面:左上容器列表、右上日志、下方容器状态。你可以鼠标点选或键盘操作——重启容器、查看日志、进入 shell、执行 docker-compose 操作,全部不用背命令。键盘绑定和 vim 一样是 j/k 上下走,e 看日志,r 重启,上手极快。我最爱的是在排查问题时,一边看日志一边看 CPU,不用在终端里切来切去。
不足: 如果你已经习惯了 docker-compose 的 CLI 组合键,lazydocker 的 keymap 需要花 10 分钟适应。另外它对单机的体验最好——跨集群的 swarm/k8s 场景它不支持。
最佳场景: 本地开发调试 + 单机生产环境日常巡检。
dry — 轻量版 lazydocker
亮点: dry 是比 lazydocker 更轻量的 TUI。它没有分屏那么复杂的布局,而是叠层式展示。在主屏上你可以看到所有容器的状态摘要,按回车展开详情——占用空间、端口映射、挂载卷、网络连接。它还能直接查看容器内的环境变量,这在调试配置问题的时候极其好用——不用 docker exec 进去找了。
不足: 界面不如 lazydocker 精致,更新也不太活跃(最后 release 2022 年)。没有 docker-compose 集成。而且在 Ubuntu 24.04 上默认的 Docker socket 路径可能有兼容问题,需要手动指定 -s /var/run/docker.sock。
最佳场景: 远程 SSH 时网络带宽有限,需要轻量工具快速排查。
组合方案推荐
这些工具单拎出来好用,组合在一起效果翻倍。推荐三套方案,看你处在什么阶段:
🏠 个人开发 / 小团队
必装: lazydocker + hadolint
lazydocker 搞定日常容器管理,hadolint 做 pre-commit hook 保证每个 Dockerfile 基础质量。加起来不到 30MB,5 分钟装好。Dockerfile 加一行 pre-commit 配置就够了。
🏢 中小团队上生产
必装: Dive + hadolint + docker-slim + ctop
CI 流水线加 hadolint check → docker-slim 瘦身 → Dive JSON 输出验证效率。线上每台机器装 ctop,运维人员 SSH 上去第一个命令就是 ctop -s cpu 看哪个容器在吃资源。
🏭 大集群 + 严控资源
必装: 全套 6 件。Dive 做镜像层审计,hadolint 做 Dockerfile 规范,docker-slim 压到极致,ctop 做 Quick Glance,lazydocker 做日常巡检,dry 做远程轻量排查。搭配 Prometheus + Grafana 做趋势分析。
FAQ
Q: 这些工具和 docker desktop 的 Dashboard 冲突吗?
不冲突。Docker Desktop Dashboard 是一个 GUI 全局管理器,而本工具链的工具都是 CLI/TUI 的深度诊断工具。你可以在 Desktop 里看到整体概况,在 Dive/ctop 里做深度排查。不过我个人认为 —— 用习惯了 lazydocker 之后,我几乎不怎么打开 Dashboard 了。
Q: docker-slim 瘦身后容器还正常跑吗?
大部分情况下没问题。docker-slim 的 --http-probe 会在瘦身后自动启动容器并探测关键端点。但建议给自己留一条后路:保留原版镜像 tag,发布后先灰度一批实例,确认日志无异常后再全量替换。我踩过一次坑 —— 瘦身后的 Python 镜像少了 ca-certificates,SSL 请求全挂了。
Q: 跨平台(Windows/Mac/Linux)兼容吗?
所有 6 个工具都跨平台。ctop 和 lazydocker 在 macOS + Docker Desktop 下工作正常。hadolint 和 Dive 都可以通过 brew 安装。docker-slim 对 macOS 上 Docker Desktop 的 socket 路径做了自动适配。唯一可能的问题是 dry 在 Windows 上的终端兼容性稍差。
Q: 这些工具在 CI/CD 里怎么集成?
有标准的 CI 集成方式。hadolint 有官方 GitHub Action。Dive 支持 JSON 输出,可以在 CI 脚本里 dive your-image --ci -j output.json,然后解析 JSON 判断镜像效率指标。docker-slim 可以直接在你的 Docker build step 后面加一行 docker-slim build your-image。ctop/lazydocker/dry 主要用在运行时环境,不建议放 CI 里。
Q: 有 K8s 环境还需要这些吗?
需要。kubectl 管理的是 Pod 和 Deployment 抽象层,而 Dive/hadolint/docker-slim 是镜像层面的工具,与编排层无关。ctop 和 lazydocker 虽然不直接管理 K8s,但当你 SSH 到 Node 节点排查容器日志时,它们比 kubectl exec 更轻量更快速。当然 ctop 的 K8s 替代品是 kube-capacity 或 kubectl top。
总结
🥇 日常必装(个人):lazydocker+hadolint — 5 分钟装好,每天省 20 次 docker 命令。
🥇 生产必装(团队):Dive+hadolint+docker-slim+ctop — 四件套覆盖构建质量、镜像优化和运行监控全流程。
🥇 场景补位:dry — 网络有限时的轻量替代方案。
如果你对这个方向感兴趣,之前还写过Git 工作流自动化工具链深度评测和2026年终端神器盘点,都是同一个系列的开发者工具链评测文章。组合起来看,从版本控制到容器管理再到终端效率,基本覆盖了开发工作流的各个环节。
最后说一句:Docker 工具链不像编程语言那样需要「学」,但装一个和用好一个之间的差距,就是那 1.8GB 镜像和 12MB 镜像的差距。花一个周末装好配好,后面省的是你每个 CI 构建的排队时间。
评测版本:Dive 0.12 / hadolint 2.12 / docker-slim 1.40 / ctop 1.0.1 / lazydocker 0.19 / dry 0.9-beta