Docker 容器日志查看(附 3 种方式),从最小示例讲到边界

编程狮(w3cschool.cn) 2026-09-29 12:09:47 浏览数 (23)
反馈

Docker 容器日志怎么看怎么管?

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

一、先看结论

你想看什么 命令 说明
全部历史日志 docker logs 容器名 一次性打印已有输出
实时跟随新日志 docker logs -f 容器名 类似 tail -f
只看最近若干行 docker logs --tail 50 容器名 快速定位尾部

Docker 容器日志:你现在要看什么?

二、容器日志存在哪

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 教程,把容器生命周期和编排一起学。

延伸学习

想把这块知识系统补齐,可以按这个顺序来:

  1. Docker 速查手册
  2. Docker 网络
  3. use_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,让它自动滚动切割,避免再次撑爆磁盘。

0 人点赞