跑ref="/tag/2019/" style="color:#3D6345;font-weight:bold;">Docker容器时,程序突然不工作了,页面打不开,接口返回500,这时候第一反应该看哪?别急着重启容器,先查日志才是正路。很多新手一出问题就docker restart,治标不治本,真正的问题藏在日志里。
用docker logs命令查看容器日志
最直接的办法就是使用docker logs命令。假设你的容器名叫web-app,执行下面这行:
docker logs web-app
就能看到这个容器输出的所有日志内容。如果程序在启动时报了错,比如配置文件路径不对、数据库连不上,这些都会原原本本地打印出来。
有时候日志太多,只想看最近几行,可以加--tail参数:
docker logs --tail 50 web-app
这样只显示最新的50行,快速定位问题。
还想实时盯着日志看?加上-f参数,跟tail -f一样:
docker logs -f web-app
这时候你再触发个请求,马上就能看到新日志刷出来。
时间戳帮你定位问题发生时刻
如果想确认某条日志是什么时候产生的,加上--timestamps或简写-t:
docker logs -t web-app
每行日志前面就会带上精确到纳秒的时间,排查问题时特别有用。比如运维说“三点钟系统崩了”,你就可以过滤那个时间段的日志,一眼看出是不是某个异常导致的。
容器启动失败?可能是根本没跑起来
有时候容器起不来,docker ps看不到,但docker ps -a能看见它状态是Exited。这时候照样能查日志:
docker logs 容器ID
哪怕容器只运行了几秒就退出,日志也保留着。常见情况比如Node.js应用缺少依赖包,Python脚本语法错误,或者端口被占用,都会在日志里清清楚楚写出来。
日志太多怎么办?导出到文件分析
有些服务日志量特别大,终端刷屏看不清。可以直接导出到文件:
docker logs web-app > app.log
然后用vim、less或者文本编辑器慢慢翻。想查特定关键词,配合grep更高效:
docker logs web-app | grep ERROR
把所有带ERROR的行筛出来,问题范围立马缩小。
注意:日志只包含标准输出
有个坑得提一下:docker logs只能看到容器内进程输出到stdout和stderr的内容。如果你的应用把日志写进了文件,比如/var/log/app.log,那用这个命令是看不到的。
这时候得进容器内部看:
docker exec -it web-app cat /var/log/app.log
或者直接挂载宿主机目录,把日志落盘,方便长期保存和分析。
小技巧:给容器起个好名字
别用默认生成的随机名字,比如adoring_cori这种,记不住还容易混淆。启动时用--name指定一个有意义的名字:
docker run -d --name api-service myapp:latest
以后查日志、进容器都方便多了,一看就知道是干啥的。
排查Docker容器问题,别慌,先看日志。掌握这几个命令,大多数故障都能快速定位,省下不少折腾时间。