如何查看(探索)Docker 容器的文件系统?

运行中的容器用 docker exec -it 容器名 /bin/sh 进去看;用 docker export 导出文件系统(不含卷,运行中不保证一致快照);容器已停止用 docker cp 或 commit 成镜像再看。本文汇总各方法。

最佳实践
如何查看(探索)Docker 容器的文件系统?封面

最常用:docker exec -it <容器名> /bin/sh 直接在运行中的容器里开个 shell 随便看。不能/不想进容器时,用 docker export 导出容器文件系统tar包(不含挂载卷内容)、docker cp 单拷目录,或 docker commit 把容器存成镜像再启动一个看。

方式一:exec 进容器(运行中)

docker exec -it myapp /bin/bash   # 没有 bash 就换 /bin/sh
ls -l /app/logs

进程还在跑,改文件会直接影响运行中的应用——只读查看最安全。

方式二:export 导出快照(不打扰进程)

docker export myapp -o snapshot.tar
mkdir fs && tar -xf snapshot.tar -C fs

导出的是容器文件系统的视图但不含卷内容;运行中写入可能在导出期间变化,不保证原子一致性或完整备份。适合离线分析、取证式排查。

方式三:commit 成镜像再探索

docker ps                            # 拿容器 ID
docker commit myapp mysnapshot       # 当前状态存成镜像
docker run --rm -it --entrypoint /bin/sh mysnapshot

commit默认会暂停容器进程以减少不一致,且不包含挂载卷数据;新容器也应隔离网络和挂载,避免影响外部服务。

方式四:已停止的容器

exec 用不了(容器没在跑),但可以:

docker cp stopped-container:/app/logs ./logs     # 拷目录出来看
docker diff stopped-container                    # 看相对镜像改了哪些文件

docker diff 是排查"容器里到底被改了什么"的神器:A=新增、C=修改、D=删除;主要反映可写层路径变化,不是内容diff或卷审计。

镜像本身怎么探索

镜像没跑成容器时:

docker create --name tmp myimg       # 只创建不启动
docker export tmp -o fs.tar && docker rm tmp
# 或看分层历史
docker history myimg

常见问题(FAQ)

Q:distroless 镜像没有 shell 怎么看文件?
A:exec 不行,用 docker cp/docker export/docker diff,或借助 kubectl debug 的临时容器(K8s 场景)。

Q:export 和 save 有什么区别?
A:export 导容器文件系统(无镜像元数据);save 导镜像(含分层与标签)。

Q:容器里磁盘占用怎么查?
A:进容器 du -sh /*;宿主机上用 docker system df -v 查看Docker对象/可写层占用;不能与容器内du含挂载的数据口径直接等同。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台