如何查看(探索)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 -it mysnapshot /bin/sh
原容器不受影响,随便折腾,看完删掉临时镜像即可。
方式四:已停止的容器
exec 用不了(容器没在跑),但可以:
docker cp stopped-container:/app/logs ./logs # 拷目录出来看
docker diff stopped-container # 看相对镜像改了哪些文件
docker diff 是排查"容器里到底被改了什么"的神器:A=新增、C=修改、D=删除。
镜像本身怎么探索
镜像没跑成容器时:
docker create --name tmp myimg # 只创建不启动
docker export tmp -o fs.tar && docker rm tmp
# 或看分层历史
docker history myimg
观测云对照
与其事后翻文件系统,不如实时采集。 容器日志、关键文件变更、进程行为由 DataKit 持续采集后,多数"进容器看文件"的需求在日志查看器里就能完成,不必频繁 exec。
常见问题(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 看每个容器可写层大小。