容器起不来,docker ps 显示 Restarting,第一反应是看日志。可有人敲完 docker logs 加容器名,屏幕上什么都没有,于是以为日志功能坏了。
docker查看日志 最常用的就是 docker logs 容器名,容器名或 ID 都行,ID 打前几位就够。加 -f 持续输出,--tail 100 只看最后一百行,--since 10m 看最近十分钟,-t 带上时间戳,这几个参数可以一起用,顺序随意。容器日志默认跟着 docker 服务走,重启机器不影响。
日志是空的,多半是程序没往 stdout 写
docker logs 抓的是容器主进程的标准输出和标准错误,程序把日志写进 /var/log/xxx.log 这种文件,docker logs 就是空的。这时进容器看:docker exec -it 容器名 sh,再 tail -n 100 那个文件。
docker compose 起的服务换成 docker compose logs -f 服务名,加 --tail=200 限制行数。程序用 systemd 或者 supervisor 托管时,日志可能被转到别处,先看它的配置。
日志别让它无限长
默认 json-file 驱动会把日志堆在 /var/lib/docker/containers 下面,跑久了能占满磁盘。在 daemon.json 里配 log-opts,max-size 设 10m,max-file 设 3,改完重启 docker,日志驱动换成 journald 后 docker logs 读的是 journald,journalctl -u docker 也能查。容器删了日志一起没,要留档就挂 volume 或者接日志系统。
时间对不上怎么办
容器里默认是 UTC,日志时间比北京时间慢八小时,看着像没更新。加 -t 看时间戳,或者在启动时挂载 /etc/localtime 和 /etc/timezone。容器和宿主机时间都调成 Asia/Shanghai 最省事,跨机器排查先统一时区,不然前后顺序都会看错。
排障时先看最后 100 行,再按时间往前翻,比从头刷屏快得多。docker查看日志 这件事,记住 -f 和 --tail 两个参数基本就够用了。日志里出现 OOMKilled,去看 docker inspect 的退出码 137。