容器Exited后可通过docker logs查看日志定位问题,结合退出码、inspect状态及临时交互式诊断深入排查。

容器Exited后,日志是定位问题最直接的依据。Docker 默认会保留容器退出前的标准输出(stdout)和标准错误(stderr),只要容器没被 rm 删除,就能通过 docker logs 查看。
确认容器状态和ID
先列出所有容器(含已退出的):
-
docker ps -a—— 找到状态为 Exited 的容器,记下其 CONTAINER ID 或 NAME - 如果容器刚退出、ID 不好记,可加时间排序:
docker ps -a --format "table {{.ID}}\t{{.Status}}\t{{.Names}}\t{{.CreatedAt}}" | sort -k4,4r
查看容器日志(核心操作)
使用 docker logs 获取原始输出:
-
docker logs <container_id_or_name>—— 显示全部日志(可能很长) -
docker logs --tail 100 <container_id_or_name>—— 只看最后 100 行,适合快速定位末尾报错 -
docker logs --since "10m" <container_id_or_name>—— 查看最近 10 分钟日志 -
docker logs -f <container_id_or_name>—— 如果容器还在运行,可实时跟踪;对已退出容器无效,会直接输出完就退出
⚠️ 注意:如果容器启动时用了 --log-driver=none 或日志被轮转清理过,logs 可能为空。此时需检查应用自身是否写日志到文件(如 /var/log/app.log),并用 docker cp 拷出分析。
检查退出码和启动命令
退出码能缩小问题范围:
-
docker ps -a --format "{{.Status}}\t{{.Names}}"中的 Exited (X),X 就是退出码 - 常见含义:0 正常退出;1 一般错误(如脚本语法错、命令未找到);137 被 OOM killer 杀掉(内存超限);143 收到 SIGTERM 后正常关闭
- 结合
docker inspect <id> | grep -A 5 'State'看详细状态,包括OOMKilled字段是否为true - 用
docker inspect <id> --format='{{.Config.Cmd}}'确认实际执行的命令,排查是否因 CMD 写错或参数缺失导致立即失败
进容器内部临时诊断(仅限未删除容器)
如果日志信息不足,且容器还存在(即使 Exited),可尝试以新入口点启动一个交互式 shell:
docker run -it --volumes-from <exited_container_name> --network container:<exited_container_name> --rm <image_name> sh- 这样能复用原容器的卷、网络配置,进入镜像环境检查配置文件、依赖、权限等
- 例如:原容器用
nginx:alpine启动失败,可用同镜像进 shell 查/etc/nginx/nginx.conf是否语法错误
不复杂但容易忽略










