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 镜像名
常见坑
- 只看 docker ps,挂掉的容器不在列表里,忘了 docker ps -a。
- 不看 logs 反复 run,浪费时间。
- 后台进程导致容器立刻退出,误以为镜像坏了。
- 端口被占却怀疑镜像,先查宿主机端口。
- OOMKilled 被忽略,实际是内存限制太小。
- 挂载路径拼反或覆盖了镜像内文件。
- 改了代码没重新 build,跑的还是旧镜像。
总结
容器启动失败排查主线:docker ps -a 找容器 → docker logs -f --tail 看真实报错 → docker inspect 看 ExitCode 和 OOMKilled → 对照端口、挂载、前台进程、依赖逐项修。日志是第一线索,别跳过它直接猜。
遇到问题加QQ23979811 协助处理