Docker日志是排查容器问题最常用的工具,但很多刚接触Docker的人第一次遇到容器启动失败或者运行异常时,会先查日志,却不知道日志文件存在哪个目录、用什么命令查看。这其实很正常,因为Docker的日志机制跟传统服务器不太一样,它既有命令行查看的方式,也有物理文件存储的位置。
用命令行查看容器日志
最直接的方式就是用docker logs命令。这个命令是Docker自带的,不需要额外安装任何东西。你只需要知道容器的名称或者ID,就能看到它的标准输出和标准错误输出。

比如你有一个叫web-app的容器,想知道它最近发生了什么,可以执行docker logs web-app。如果容器已经运行了很久,日志特别多,可以加上--tail参数只看最后几十行,比如docker logs --tail 50 web-app。如果要实时跟踪日志输出,就像tail -f那样,用docker logs -f web-app。
需要注意一点,容器必须存在,哪怕它已经停止了,docker logs也能查看它之前的日志。但如果是已经被删除的容器,这个命令就用不了了,需要提前把日志保存下来。
还有一个实用技巧是用--since和--until参数查看某个时间段内的日志。比如docker logs --since 2026-06-17T10:00:00 web-app,只显示这个时间点之后的日志,对于排查几个小时前出现的问题特别有用。

Docker日志文件在主机上的存储位置
如果你不想用命令行,想直接去服务器上看日志文件,那就需要知道Docker把日志写在了哪里。默认情况下,Docker的日志文件存储在/var/lib/docker/containers/目录下。
这个目录里面有很多以容器ID命名的子文件夹,每个文件夹对应一个容器。进去之后,你会看到一个以-json.log结尾的文件,比如abc123def456-json.log,这就是容器的日志文件。

这个文件格式是JSON,每一行都是一条日志记录linux apache 虚拟主机,包含log字段和time字段。log字段里存的是容器输出的内容,time字段是这条日志的时间戳。你可以用cat、less或者tail直接查看这个文件,也可以用grep搜索关键字。
不过要注意,/var/lib/docker/目录通常需要root权限才能访问docker 日志在哪,普通用户是打不开的。如果不想每次都sudo,可以把自己的用户加入docker组,或者直接用docker logs命令。另外,这个目录下的文件结构可能会因为Docker版本不同略有差异,但大体的路径是一样的。
日志驱动不同日志位置也不同
Docker支持多种日志驱动,不同驱动会把日志写到不同的地方。默认的驱动是json-file,就是上面说的那个JSON文件。但如果你用的是其他驱动,比如syslog、journald、gelf、fluentd等等docker 日志在哪,日志就不在/var/lib/docker/containers/下面了。
举个例子,如果你的容器配置了syslog驱动,日志会发送到系统的syslog服务,位置通常是/var/log/syslog或者/var/log/messages。如果用journald驱动,日志会被systemd的journal接管,你得用journalctl命令来查看。如果用gelf或者fluentd,日志会直接发送到对应的日志收集服务,本地根本就不会存。
怎么知道当前容器用的是哪个日志驱动呢?用docker inspect 容器名命令,在输出的JSON里找LogConfig字段wps for linux,里面会显示Type,比如json-file、syslog之类的。这个信息对于排查日志问题很重要,因为驱动不对,你就找错了地方。
容器内日志与标准输出的关系
很多新手会把容器内的日志文件和Docker日志搞混。容器内部的应用可能会把日志写到它自己的文件里,比如Nginx的/var/log/nginx/access.log,或者某个Java应用的/app/logs/app.log。这些是应用级别的日志,跟Docker的日志机制是两回事。
Docker的docker logs命令捕获的只是容器主进程的标准输出和标准错误输出。也就是说,如果你的应用把日志写到了文件里,而不是打印到控制台,那么docker logs是看不到这些日志的。这种情况下,你需要进入容器内部去查看那些文件,或者把容器的日志目录挂载到宿主机上,方便直接读取。
解决这个问题的一个常见做法是,在Dockerfile里把应用的日志文件软链接到标准输出,或者直接配置应用把日志输出到stdout。很多官方镜像比如Nginx、Apache都已经这么做了,所以docker logs能看到它们的访问日志。但如果你自己构建的镜像没有做这个配置,那就只能进容器或者挂载目录了。
Docker日志的管理其实不复杂,关键在于搞清楚几个概念:是用命令行查看还是找物理文件,日志驱动是什么,应用日志输出到了哪里。只要把这几点弄清楚,大部分日志相关的场景你都能应付。生产环境中,一般不会长期依赖本地的日志文件,而是会用ELK或者Loki这类日志收集系统,把Docker日志集中管理起来,方便检索和告警。不过在开发和调试阶段,docker logs加上-f参数,已经是够用的组合了。
