Docker容器启动失败查看日志排查

容器一启动就退出、docker ps 里根本看不到,是 Docker 新手最常见的问题。很多人反复 run 却不看日志,自然找不到原因。关键原则:容器退出不代表没记录,用 logs 和 inspect 看它为什么挂。本文给出一套从日志到配置的排查顺序。

一、先确认容器状态

# 只看正在运行的,挂掉的容器不会出现
docker ps

# 看所有容器,包括已退出的,记录 CONTAINER ID
docker ps -a

状态为 Exited (1) 或 Exited (0),括号里就是退出码:0 是正常退出,非 0 是异常。

二、看容器日志(最关键一步)

# 看全部日志
docker logs 容器名或ID

# 实时跟踪最新输出,类似 tail -f
docker logs -f 容器名

# 只看最近 100 行
docker logs --tail 100 容器名

# 带时间戳
docker logs -t 容器名

日志里通常直接写了错误,比如配置文件找不到、端口被占、数据库连不上、权限拒绝。

三、查看容器详细退出原因

docker inspect 容器名 | grep -A 10 State

关注 ExitCode、Error、OOMKilled:OOMKilled 为 true 说明内存不足被杀死。

四、常见启动失败原因

1. 前台进程退出,容器就结束

容器必须有一个前台进程一直跑,命令执行完就退出,容器自然停。比如 nginx 镜像你用 nginx -s stop 或直接执行个脚本,跑完就退。要保证 CMD 以前台方式运行。

2. 配置文件/挂载路径错误

docker run -v /host/etc/nginx:/etc/nginx nginx

宿主机路径不存在、或挂载把镜像内配置覆盖成空,服务起不来。

3. 端口冲突

docker: Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use

宿主机 80 已被占用,换 -p 8080:80。

4. 数据库等依赖没就绪

应用启动时连不上 MySQL,直接退出。可用 restart 策略或等待脚本。

5. 权限不足 / 镜像命令写错

docker run 末尾的命令拼错,或挂载目录权限导致进程无法写文件。

五、反复重启看日志

# 查看实时日志验证修复
docker logs -f --tail 50 容器名

必要时用交互方式进临时容器复现:

docker run -it --entrypoint sh 镜像名

常见坑

  1. 只看 docker ps,挂掉的容器不在列表里,忘了 docker ps -a。
  2. 不看 logs 反复 run,浪费时间。
  3. 后台进程导致容器立刻退出,误以为镜像坏了。
  4. 端口被占却怀疑镜像,先查宿主机端口。
  5. OOMKilled 被忽略,实际是内存限制太小。
  6. 挂载路径拼反或覆盖了镜像内文件。
  7. 改了代码没重新 build,跑的还是旧镜像。

总结

容器启动失败排查主线:docker ps -a 找容器 → docker logs -f --tail 看真实报错 → docker inspect 看 ExitCode 和 OOMKilled → 对照端口、挂载、前台进程、依赖逐项修。日志是第一线索,别跳过它直接猜。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-11-15 07:42 
'); })();