容器启动失败怎么查
容器起不来时不要凭感觉改配置,按固定顺序走一遍:先看状态与退出码,再看日志,然后用 inspect 核对实际生效的配置,接着验证入口命令与参数,最后对齐宿主环境。顺序的意义在于每一步都能排除一类原因,避免在错误的方向上反复试错。
基本信息
| 第 1 步 | docker ps -a 看容器状态与退出码 |
|---|---|
| 第 2 步 | docker logs 容器 --tail=200 看启动输出 |
| 第 3 步 | docker inspect 看 Config、State 与 Mounts 是否符合预期 |
| 第 4 步 | 用 --entrypoint sh 或覆盖 command 手动进镜像验证环境 |
| 第 5 步 | 对齐宿主侧条件:端口占用、路径权限、资源限制、内核版本 |
常见退出码含义
- 退出码 0 后立即结束:容器的主进程跑完就退出,通常缺前台运行参数
- 退出码 1:应用自身启动报错,去看日志首屏的异常栈
- 退出码 126 或 127:入口脚本不可执行或命令不存在,检查路径与执行权限
- 退出码 137:被强制杀死,常见于内存超限或人工 kill
- 退出码 139:段错误,通常是二进制与运行环境不匹配
排查命令组
排查命令组
docker ps -a | head # 看状态与退出码
docker logs myapp --tail=200 # 看应用输出,注意最前面的报错
docker inspect myapp | head -60 # 核对挂载、端口、入口与限额
# 绕开默认入口直接进镜像,验证命令是否存在、环境变量是否齐全
docker run --rm -it --entrypoint sh myapp:1.2.3
docker inspect myapp -f '{{.State.ExitCode}} {{.State.Error}}' # 精确取退出码症状与方向对照
| 症状 | 常见原因 | 下一步 |
|---|---|---|
| 启动即退出且无日志 | 主进程不是前台运行 | 检查启动命令是否带前台参数 |
| 报命令找不到 | 入口路径写错或脚本不可执行 | 核对路径与文件权限 |
| 报权限拒绝 | 挂载目录属主或 SELinux 标签不符 | 调整属主或加标签参数 |
| 日志空白但状态异常 | 应用日志写到了文件而非标准输出 | 改日志输出到标准输出 |
| 换机器就起不来 | 架构不符或内核版本差异 | 核对镜像架构与宿主内核 |
「同一镜像在 A 机器能跑、在 B 机器不能」重点查四项:镜像架构是否为当前 CPU 架构、挂载路径是否存在且权限正确、宿主内核版本是否满足要求、资源限制是否过紧。
排查前先用 docker images 核对标签,确认你调试的就是出问题的那一个:镜像标签被覆盖或指向旧版本时,所有排查结论都会跑偏。