如何查看(探索)Docker 容器的文件系统?
运行中的容器用 docker exec -it 容器名 /bin/sh 进去看;用 docker export 导出文件系统(不含卷,运行中不保证一致快照);容器已停止用 docker cp 或 commit 成镜像再看。本文汇总各方法。
最常用: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含挂载的数据口径直接等同。