docker diff命令用于查看容器相对于原始镜像的文件系统变化,不依赖容器运行状态;输出中A表示新增、D表示删除、C表示修改,仅反映可写层变动,挂载卷内容不显示。
直接用 docker diff 就能查出容器自创建以来,相对于原始镜像的文件系统变动。它不依赖容器是否运行,也不看进程或日志,只专注“哪些文件被加、删、改了”。
diff 输出的三种状态含义要记牢
结果每行开头是一个字母,后面跟着路径,含义很明确:
- A:容器里新增的文件或目录(镜像里原本没有)
- D:容器里删除的文件或目录(镜像里有,现在没了)
- C:容器里修改过的文件或目录(内容或元数据变了,比如权限、时间戳、内容重写)
怎么快速执行并解读结果
命令很简单:
docker diff
例如:docker diff web-server 或 docker diff a1b2c3d4
输出可能是这样的:
A /var/log/app.log<br>C /etc/nginx/nginx.conf<br>D /tmp/installer.sh
说明:日志文件是容器运行后新写的;Nginx 配置被改过;安装脚本被删掉了——这些都不是镜像自带的变更,而是容器生命周期中发生的实际改动。
注意几个关键细节
- 对比基准是创建该容器所用的原始镜像,不是上一次 diff 的结果,也不是当前运行状态快照
- 挂载卷(
-v)和绑定挂载的内容不会出现在 diff 结果里,因为它们不属于容器可写层 - 如果容器里删的是自己创建的文件(比如先
touch /a.txt再rm /a.txt),diff 不会显示D /a.txt,因为它从未存在于原始镜像中,删它不构成“镜像 vs 容器”的差异 - 路径以根目录
/开头,层级结构清晰,适合配合grep过滤,比如docker diff myapp | grep "^A"只看新增项
结合排查场景实用一点
当发现容器行为异常时,可以按这个顺序辅助判断:
- 先
docker diff看有没有不该出现的文件(比如临时上传的 shell 脚本、意外生成的大日志) - 再
docker logs看程序输出是否报错 - 最后
docker inspect核对配置、挂载、网络等是否符合预期
diff 就像一份静态的“文件操作审计报告”,不复杂但容易忽略。











