
你容器跑起来后想看它到底打印了什么,却找不到日志文件?或者日志刷得太快抓不住重点?Docker 容器日志查看,最常用的是 docker logs 看历史、加 -f 跟实时、用 --tail 看末尾。本文用最小示例讲清三种方式、怎么按时间过滤,以及两个边界坑。看完你能随时拿到容器输出,排错不再抓瞎。今天这篇文章,编程狮就把这块讲透。从三种基础用法到磁盘保护,再到定位宿主机上的原始日志文件,排障链路一次讲全。
一、先看结论
| 你想看什么 | 命令 | 说明 |
|---|---|---|
| 全部历史日志 | docker logs 容器名 |
一次性打印已有输出 |
| 实时跟随新日志 | docker logs -f 容器名 |
类似 tail -f |
| 只看最近若干行 | docker logs --tail 50 容器名 |
快速定位尾部 |

二、容器日志存在哪
Docker 容器日志查看 的基础是:默认情况下,容器里进程打印到标准输出(stdout)和标准错误(stderr)的内容,会被 Docker 的日志驱动捕获并存到宿主机的一个 json 文件里。你不用自己去翻那个文件,docker logs 命令就是它的统一入口。
一个比喻:容器像一台打印机,打印的内容(日志)被 Docker 这台“记录仪”自动存成一卷纸,docker logs 就是让你把这卷纸调出来看。建议先过一遍 Docker 教程 的容器章节,理解前台/后台运行。
三、方式一:看全部历史日志
# 把容器名换成你的容器名或 ID
docker logs my-nginx
上面这段做了什么:打印该容器从启动到现在的所有 stdout/stderr 输出。如果容器跑了很久日志很多,会把屏幕刷满。适合“我想看看它之前到底报了什么”的复盘场景。
四、方式二与三:实时跟随与只看末尾
# 方式二:实时跟随,新日志不断追加显示(Ctrl+C 退出)
docker logs -f my-nginx
# 方式三:只看最后 50 行,快速定位最新状态
docker logs --tail 50 my-nginx
# 组合:只看最近 20 行并实时跟随
docker logs -f --tail 20 my-nginx
上面这段做了什么:-f 让命令像 tail -f 一样持续输出新日志,调接口、看报错时最有用;--tail 50 只取最后 50 行,避免被历史淹没。-f --tail 20 常组合起来:先定位尾部,再跟实时。
五、两个最容易踩的边界坑
| 现象 | 原因 | 修复 |
|---|---|---|
| 日志文件大到撑爆磁盘 | 默认 json 驱动不限制大小 | 配置 max-size / max-file 滚动切割 |
docker logs 提示 “no logs” |
容器用了 none Docker 部署,或日志被清 | 确认启动时的 --log-driver,别用 none |
第一个坑很现实:json 日志驱动默认不限制体积,长期运行的容器日志可能涨到几个 GB。要在 /etc/docker/daemon.json 里给日志驱动设 max-size(如 10m)和 max-file(如 3),让它自动滚动。第二个坑:如果启动容器时指定了 --log-driver none,Docker 根本不存日志,docker logs 自然无内容,排错时记得确认驱动类型。
docker logs 是排查容器问题第一道入口,但它的参数比很多人以为的更实用。docker logs 容器名 默认吐全部日志;加 -f 可以像 tail -f 一样实时跟随;--tail 100 只看最后 100 行,避免被历史刷屏;--since 2026-09-29T10:00:00 和 --until 按时间过滤,快速定位某个时间段出的问题;--timestamps 带上时间戳,便于和监控系统对齐。别忘了日志其实来自容器用的“日志驱动”,默认是 json-file,它会把容器的标准输出写成宿主上的 JSON 文件。
真正容易翻车的是磁盘。默认 json-file 不限制大小,容器若疯狂打日志,那个 JSON 文件会无限膨胀,直到把宿主机磁盘写满、所有容器一起罢工。正确做法是在 daemon.json 里给 json-file 配 max-size(单文件上限,比如 10m)和 max-file(保留几个轮转文件,比如 3),让旧日志自动滚动删除。如果你的日志量特别大,也可以直接换成 local 驱动(更省空间)或接 syslog/fluentd 把日志统一送到外部系统,而不是堆在本地。用 docker inspect 容器 | grep -i logging 能查看单个容器实际用哪个驱动和配置。
定位到日志还不够,还得知道日志在宿主上的位置:/var/lib/docker/containers/<id>/ 下就躺着 json-file 的原始文件,必要时可以直接 tail 它。实战排障有个常用套路:先用 --tail 和 --since 缩小范围,确认报错时间点,再结合 -f 复现现场;如果是“容器起不来”,立刻 docker logs 看启动崩溃栈;如果是“运行久了变慢或磁盘告警”,多半是日志或数据卷没限大小。把这些命令和驱动配置组合起来,线上排障会从容很多。
讲个真实排障顺序:先 docker ps 看容器是否在运行,若 Exited 就 docker logs 容器名 看启动崩溃栈;若容器在跑却“没日志”,先确认启动时的 --log-driver 是不是 none。线上磁盘告警时,第一时间 docker logs --tail 200 --since 1h 容器名 缩小范围,再用 df -h 看是不是 json 日志文件撑爆了 /var/lib/docker。把“看状态→看日志→看磁盘→配滚动”四步记熟,绝大多数容器日志问题都能在十分钟内定位。另外,应用自己写进文件的日志和 Docker 捕获的标准输出是两回事,排查前要分清是哪一层缺了日志。
最后提醒:日志驱动配置改完要重启 Docker 守护进程才生效;用 docker inspect 容器 | grep -i logging 能确认单个容器实际用的驱动和上限,避免“配了却没生效”的误判。
运维时先配置好 Docker 守护进程,把 docker logs 命令运行起来,检查输出是否符合预期;若提示无日志,按“驱动为 none”的方向排查失败原因并修复。排错命令根据官方文档整理,未在本机逐平台执行。
总结
要点带走:
- 容器 stdout/stderr 由 Docker 日志驱动统一捕获,
docker logs是查看入口; - 三种方式:全量看历史、-f ssh 连接、--tail N 看末尾,可自由组合;
- 别忘了给日志配 max-size 滚动,也别用
none驱动导致无日志可查。
下一步建议系统过一遍 Docker 教程,把容器生命周期和编排一起学。
延伸学习
想把这块知识系统补齐,可以按这个顺序来:
Q:docker logs 和看容器里的文件有什么关系?
A:默认 json 日志驱动下,你不用进容器翻文件,docker logs 直接读宿主机上 Docker 捕获的标准输出。只有当你在容器里自己写了日志文件(如 /var/log/app.log),才需要 docker exec 进去看,那是两回事。
Q:实时日志怎么退出?
A:带 -f 的命令会一直阻塞输出,按 Ctrl+C 即可退出跟随,不会影响容器本身运行。
Q:日志太大把磁盘写满了怎么办?
A:临时可手动清理对应 json 日志文件,但根治要在 daemon.json 配置日志驱动的 max-size 和 max-file,让它自动滚动切割,避免再次撑爆磁盘。

TRAE-AI编程



