查容器日志不能只用 docker logs,需确认应用输出到 stdout/stderr;docker stats 指标有限且有滞后性;容器内 ps/top 受 pid namespace 隔离限制;日志需配置轮转或对接外部系统,避免磁盘塞满。

查容器日志:别直接 docker logs 就完事
容器崩溃后日志没了?docker logs 返回空?常见原因是应用没输出到 stdout/stderr,或者日志被重定向到了文件。Docker 只捕获容器主进程的 stdout/stderr,其他路径的日志它看不见。
- 确认应用是否真的打到标准输出:
docker run -it alpine echo "hello"能看到,但docker run -it alpine sh -c 'echo "hello" > /tmp/log'就看不到 - 避免在容器里写日志文件;如果必须写,挂载
/var/log到宿主机,或用tail -f /var/log/app.log作为容器主进程(注意 PID 1 问题) - 加
--timestamps和--tail=100提高可读性:docker logs --timestamps --tail=100 myapp - 日志量大时,
docker logs会卡顿甚至 OOM,优先用journalctl -u docker或对接外部日志系统
实时监控容器资源:docker stats 的真实限制
docker stats 看起来方便,但它只暴露 cgroups v1 的基础指标(CPU、内存、网络 I/O),不包含进程数、文件描述符、OOM kill 记录等关键信号,且默认刷新间隔 5 秒,可能错过短时尖峰。
- 内存使用看
MEM USAGE / LIMIT,但注意:Linux 内存回收滞后,cache部分会被计入 usage,实际压力要看rss—— 得进容器查cat /sys/fs/cgroup/memory/memory.stat | grep rss - CPU 百分比是相对于所有 CPU 核心的,不是单核;限制为
2表示最多用满 2 个核,但docker stats不显示当前用了哪几个核 - 网络收发量不含容器间通信(docker0 桥接流量不计),要抓包得用
tcpdump -i docker0 - 生产环境别依赖它做告警,改用
cAdvisor+ Prometheus,或直接读/sys/fs/cgroup/...下原始数据
容器内进程不可见?ps 和 top 失效原因
进容器执行 ps aux 只看到几个进程?不是容器“没进程”,是默认 PID namespace 隔离导致你只能看到本容器启动的进程树,看不到宿主机或其他容器的进程。
- 检查是否用了
--pid=host:没有的话,ps结果天然受限,这是设计,不是 bug -
top在容器里常卡住或报错TERM environment variable not set,加-b -n 1改成批处理模式:top -b -n 1 | head -20 - 想看完整进程链,进容器后运行
cat /proc/1/cmdline确认主进程命令行,再用ps --forest -o pid,ppid,cmd看层级 - 某些精简镜像(如
scratch或distroless)压根没ps,别白费劲,换busybox镜像调试,或提前打好调试工具
日志落盘与轮转:别让 /var/lib/docker/containers 塞爆磁盘
Docker 默认把日志存在 /var/lib/docker/containers/<id>/<id>-json.log</id></id>,不轮转、不压缩、不清理——跑一周就几十 GB 很常见,而且这些文件不能用 logrotate 直接 truncate,会破坏 Docker 的文件偏移追踪。
- 启动容器时强制指定日志驱动:
docker run --log-driver=json-file --log-opt max-size=10m --log-opt max-file=3 - 全局配置写进
/etc/docker/daemon.json,改完必须systemctl restart docker,热加载不生效 - 已有暴涨的日志文件,别
rm或truncate,用docker logs --tail=1 mycontainer > /dev/null触发 Docker 自动清理旧条目(仅限 json-file 驱动) - 长期运行的服务,建议关掉 Docker 自带日志(
--log-driver=none),由应用自己对接rsyslog或fluentd
最麻烦的其实是日志格式混用:有的服务打 JSON,有的打纯文本,还有的带 ANSI 转义符——解析时字段对不上、时间戳时区不一致、换行符被切碎,这些问题不会报错,但会让监控告警漏触发。










