首页/云/Docker 容器速查/容器起不来的通用排查路径
容器排障52 条

容器起不来的通用排查路径

五步法:看状态与退出码 → 看日志尾部 → 看 inspect 的 Error 字段 → 用同镜像交互复现 → 再回到 Dockerfile/参数层面修正。

Docker 容器速查云更新于 2026-10-13

容器起不来的排查路径

容器启动失败的原因通常落在四层:启动命令与环境变量(配置层)、文件与目录权限(挂载层)、网络与端口(连接层)、镜像本身(内容层)。有效的排查是有序收敛:先拿状态与退出码确定失败层级,再看日志与引擎记录缩小范围,最后用同一镜像开交互容器手工复现,把问题定位到具体一行配置。

基本信息

第一步docker ps -a 看状态、退出码与重启次数
第二步docker logs --tail 200 看应用输出
第三步docker inspect 看 State.Error、Health 与配置项
第四步同镜像开交互容器手工复现启动命令
辅助命令docker events 看生命周期事件、docker stats 看资源
常见诱因命令不存在、权限不足、端口冲突、依赖未就绪、环境变量缺失

典型使用场景

  • 发布后容器反复重启,需要快速定位是配置还是依赖问题
  • 容器启动即退出,日志几乎没有输出
  • 健康检查一直失败,容器被编排平台反复重建
  • 挂载目录权限变化导致启动失败
  • 端口被占用,容器无法绑定监听地址

五步排查

五步排查
# 一、状态与退出码:先确定失败层级
docker ps -a --filter name=web
docker inspect -f 'status={{.State.Status}} exit={{.State.ExitCode}} err={{.State.Error}} restarts={{.RestartCount}}' web

# 二、应用输出(失败往往在最后几行)
docker logs --tail 200 web

# 三、引擎侧事件与健康检查
docker events --filter container=web --since 30m | tail -20
docker inspect -f '{{json .State.Health}}' web

# 四、清除入口,用同镜像手工复现启动命令
docker run --rm -it --entrypoint sh app/web:1.0
docker run --rm -it --entrypoint sh app/web:1.0 -c 'node server.js'

# 五、核对运行时配置:挂载、环境变量、命令
docker inspect -f '{{json .Mounts}}' web
docker inspect -f '{{json .Config.Env}}' web
docker inspect -f '{{json .Config.Cmd}} {{json .Config.Entrypoint}}' web

现象与诱因对照

现象常见诱因处理方向
启动即退出,日志为空命令不存在或入口写错核对镜像内命令与入口配置
报权限拒绝挂载目录或文件属主不匹配调整属主或运行用户
报端口被占用宿主端口已被其他进程或容器使用换端口或停掉占用方
连不上依赖服务网络归属不对或依赖未就绪核对网络与启动顺序
健康检查失败探针命令不存在或路径不对修正探针或镜像内容
重启次数不断增长进程无法稳定运行先停重启策略再排查
日志为空不等于没有问题:进程可能在打印任何内容之前就退出,这时退出码与引擎错误字段是唯一线索。
改动参数或镜像后要重建容器:只 restart 仍会使用旧配置,容易得出「改了没用」的错误结论。

易错点

  • 日志为空时反复重跑容器而没有看退出码与引擎错误字段,排查会原地打转
  • 改动参数后忘记重建容器,仍在用旧配置复现问题,是高频自坑
  • 在生产容器上直接改启动参数做试验,应改用同镜像的临时容器手工复现
  • 忽略挂载与环境变量差异:本地能起、线上起不来,多数差异都出在这两处

数据来源与参考

  • Docker 官方文档:Debugging containers(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌