容器异常退出后,日志是定位问题最直接的依据;docker默认保留退出前stdout/stderr,只要容器未被rm删除,即可用docker logs --tail n或--since配合inspect查退出码(如137表示oom)精准定位。

容器异常退出后,日志是定位问题最直接的依据。Docker 默认保留退出前的标准输出(stdout)和标准错误(stderr),只要容器没被 docker rm 删除,就能用 docker logs 提取最后关键片段。
快速定位已退出容器
先确认目标容器是否存在且状态为 Exited:
-
docker ps -a --filter "status=exited" --format "table {{.ID}}\t{{.Status}}\t{{.Names}}\t{{.CreatedAt}}"—— 只列出已退出容器,并按创建时间倒序,方便找到最新失败的那个 - 若容器名不明确,可用
docker ps -a -q --filter "status=exited" | head -n1快速获取最近一个退出容器的 ID
精准截取最后 N 行日志
对已退出容器,-f(实时跟踪)无效,但 --tail 非常高效:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
-
docker logs --tail 100—— 直接输出最后 100 行,通常报错堆栈就在末尾 -
docker logs -n 200—— 等价写法,-n 是 --tail 的短选项 - 配合时间范围更准:
docker logs --since "5m" --tail 50—— 查最近 5 分钟内产生的最后 50 行,避免被启动初期的冗余日志干扰
结合退出码与状态诊断根本原因
单看日志还不够,需联动退出码判断故障类型:
- 查退出码:
docker ps -a --format "{{.Status}}\t{{.Names}}" | grep Exited,例如Exited (137)表示 OOM 被杀 - 验证是否 OOM:
docker inspect <id> --format='{{.State.OOMKilled}}'</id>,返回true即确认 - 检查完整退出上下文:
docker inspect <id> --format='{{json .State}}'</id>,重点关注FinishedAt、Error和ExitCode字段
日志为空时的备用方案
如果 docker logs 返回空,不代表没日志,可能是以下情况:
- 容器启动时指定了
--log-driver=none,此时 Docker 不捕获 stdout/stderr - 应用把日志写到了文件(如
/var/log/app.log),而非控制台;可用docker cp :/var/log/app.log ./app.log拷出分析 - 日志驱动启用了轮转(如
max-size),旧日志已被清理;此时需检查宿主机上的日志文件路径(默认/var/lib/docker/containers/<id>/<id>-json.log</id></id>)










