docker diff 命令用于查看容器文件系统相对于原始镜像的变更,不依赖容器运行状态,仅比对可写层与镜像只读层差异,输出 A(新增)、C(修改)、D(删除)三类标记,适用于调试、安全排查和镜像优化。

直接用 docker diff 就能查看容器文件系统相对于原始镜像的修改,它不依赖容器是否运行,只比对可写层与镜像只读层的差异,输出 A(新增)、C(修改)、D(删除)三类标记。
基础用法:快速获取变更列表
执行命令即可获得完整差异清单:
-
docker diff <容器名或ID>—— 例如docker diff web-server - 输出每行以 A/C/D 开头,后跟路径,如
A /tmp/log.txt或C /etc/nginx/nginx.conf - 即使容器已停止,命令仍有效;它不看进程、网络或内存,只看文件系统层级变化
聚焦高风险路径:筛选关键变更
全量输出可能很长,建议结合 grep 快速定位可疑位置:
docker diff myapp | grep -E '^(A|C|D) (/etc/|/usr/bin/|/bin/|/sbin/|/root/|/home/|/tmp/|/var/tmp/)'- 重点关注:
/etc/passwd和/etc/shadow出现 C,/usr/bin/ls或/bin/bash被标 C,/etc/cron.d/下出现 A - 临时目录(
/tmp、/var/tmp)大量 A 且含.sh、.elf等后缀,需立即检查
验证具体文件:确认篡改性质
看到标记后,进一步查内容和哈希:
- 对 C 类文件,对比哈希:
docker exec myapp sha256sum /etc/nginx/nginx.conf,再从原始镜像导出同路径文件做比对 - 对 A 类文件,看权限和内容:
docker exec myapp ls -l /tmp/malware.sh,再用cat或head -n 10查首几行 - 注意:挂载卷(
-v)和 tmpfs 中的改动不会出现在 diff 输出里,它们不在联合文件系统中
配合其他命令交叉验证
diff 只反映文件层变化,需结合其他命令判断实际影响:
- 查进程:
docker top myapp看是否有异常长期运行的进程 - 查网络:
docker exec myapp netstat -tuln看是否有监听陌生端口 - 查镜像来源:
docker inspect myapp | jq '.Image'确认基础镜像是否可信


















