title: " AI排查Docker容器起不来 | ps和logs三件套" category: 人工智能 tags:


Docker 是独立开发者部署项目的救命工具。

也是制造崩溃的高频来源。

最常见的一句话:

容器起不来。

但“起不来”至少有五种情况:

build 失败。
容器启动后立刻退出。
容器一直 restarting。
容器 running 但 unhealthy。
容器 running 但端口访问不到。

每一种排查路径都不一样。

所以用 AI 排查 Docker,第一步不是让模型给命令。

第一步是把状态说清楚。

1. Docker 排错三件套

最小三件套:

docker compose ps
docker compose logs --tail=200
docker compose config

含义:

命令 用途
docker compose ps 看服务状态、端口、退出码
docker compose logs --tail=200 看最近错误
docker compose config 展开最终 Compose 配置

给 AI 时,最好按服务拆。

例如:

docker compose logs --tail=200 app
docker compose logs --tail=200 db
docker compose logs --tail=200 nginx

不要把所有服务几千行混在一起。

先让辅助模型整理,再让 Fable 5 判断根因。

2. 给 AI 的 Docker 排错包

模板:

【现象】
- 哪个服务起不来:
- 状态:exited / restarting / unhealthy / running but inaccessible
- 退出码:
- 是否最近部署后出现:

【环境】
- 服务器系统:
- Docker 版本:
- Docker Compose 版本:
- 部署目录:

【compose】
- docker-compose.yml 脱敏版:
- .env 变量名清单,不含真实值:

【状态】
- docker compose ps 输出:

【日志】
- app logs:
- db logs:
- nginx logs:

【最近变更】
- 镜像:
- 环境变量:
- volume:
- 端口:
- 数据库迁移:

【边界】
- 不删除 volume
- 不清空数据库
- 不重启整机
- 先给只读验证步骤

这份包能让 AI 迅速判断:

是应用自身崩。
是数据库没 ready。
是环境变量缺。
是端口映射错。
是 volume 权限问题。
还是 healthcheck 写错。

3. 常见状态一:Exited

如果 docker compose ps 里看到:

app exited with code 1

优先看 app 日志。

常见原因:

启动命令错。
环境变量缺失。
依赖文件不存在。
数据库连接失败后进程退出。
端口被占用。
代码运行时报错。

给 AI 的关键证据:

退出码。
最后 50 行日志。
Dockerfile CMD/ENTRYPOINT。
compose command。
环境变量名称。

Prompt:

请根据 app 容器退出码和最后 200 行日志,判断退出发生在启动脚本、应用初始化、数据库连接还是运行时。
每个判断必须引用日志行。
先给只读验证步骤,不要建议删除 volume。

4. 常见状态二:Restarting

restarting 通常说明:

容器启动后崩溃。
restart policy 又把它拉起来。
于是循环。

这时最重要的是抓住第一段错误。

命令:

docker compose logs --tail=300 app

如果日志太滚,可以先暂停自动重启,但生产环境要谨慎。

更稳的是:

docker inspect 容器名 --format '{{.State.ExitCode}} {{.State.Error}}'

让 AI 判断:

是应用崩溃导致重启。
还是 healthcheck 失败导致重启。
还是外部依赖不可用导致重启。

注意:

不要一看到 restarting 就重启服务器。

服务器重启只是把问题重新演一遍。

5. 常见状态三:Unhealthy

容器 runningunhealthy,说明进程还在,但健康检查失败。

常见原因:

healthcheck 路径错。
应用启动慢,start_period 太短。
healthcheck 用 localhost 但服务监听 0.0.0.0 或反过来。
接口需要认证。
数据库还没 ready。

给 AI 的材料:

healthcheck 配置。
docker inspect 里的 Health.Log。
应用实际监听端口。
curl 容器内健康检查结果。

只读命令:

docker inspect 容器名 --format '{{json .State.Health}}'

Prompt:

请判断 unhealthy 是应用真实不可用,还是 healthcheck 配置不匹配。
请给出容器内 curl 验证方式和最小修改建议。

这类问题很适合 Fable 5。

因为它要同时看 Compose、应用端口、healthcheck 和日志。

6. 常见状态四:端口访问不到

容器 running,但浏览器打不开。

先分三层:

容器内服务是否监听。
宿主机端口是否映射。
云服务器防火墙是否放行。

命令:

docker compose ps
ss -tulpn
curl -I http://127.0.0.1:端口

常见错误:

应用只监听 127.0.0.1。
compose 没写 ports。
ports 写成了 expose。
宿主机防火墙没开。
云安全组没开。
Nginx upstream 指向错端口。

给 AI 时要说明:

容器内端口。
宿主机映射端口。
Nginx 反代端口。
云安全组端口。

否则它很容易猜错层。

7. 常见状态五:volume 权限问题

日志里可能出现:

permission denied
EACCES
cannot create directory
read-only file system

常见于:

容器用非 root 用户运行。
宿主机目录权限不对。
挂载了只读 volume。
数据库 data 目录被错误 owner。

这类问题要谨慎。

不要让 AI 直接给:

chmod -R 777

这种粗暴命令。

Prompt:

请根据 volume 配置和 permission denied 日志,判断是宿主机目录权限、容器用户、只读挂载还是应用路径错误。
不要建议 chmod -R 777。
请给出最小权限修复方案和回滚方式。

这是非常重要的约束。

很多网上教程遇到权限问题就 777

生产环境不要这样。

8. 常见状态六:depends_on 误解

很多人以为:

depends_on:
  - db

就代表数据库已经 ready。

不是。

它通常只代表启动顺序。

不代表服务可用。

所以 app 可能先启动,然后数据库还没 ready,app 连接失败退出。

修复方向:

应用层重试数据库连接。
给 db 加 healthcheck。
depends_on 使用 condition: service_healthy。
启动脚本等待依赖。

让 AI 审查:

请检查这个 docker-compose.yml 是否误以为 depends_on 等于数据库可用。
如果是,请给出最小改法。

9. 4SAPI 模型分工

Docker 排错建议分工:

阶段 模型
logs 摘要 低成本模型
compose 风险审查 Fable 5
根因判断 Fable 5
命令解释 低成本模型
修复方案复核 Fable 5 / reviewer

4SAPI 日志字段:

error_type: docker_container_failed
service: app/db/nginx
status: exited/restarting/unhealthy
risk_level
model
evidence_ids
fix_requires_human_confirm

如果涉及数据库 volume,自动标高风险。

不要让低成本模型直接给破坏性命令。

10. 一条完整 Prompt

你是 Docker Compose 排错助手。

我会提供 docker compose ps、logs、config 和最近变更。

请先判断容器问题属于:
1. build 失败
2. 启动命令失败
3. 应用运行时报错
4. 依赖服务未 ready
5. 环境变量缺失
6. 端口映射错误
7. volume 权限问题
8. healthcheck 配置问题

要求:
- 每个判断引用证据。
- 先给只读验证命令。
- 不要建议删除 volume、清空数据、chmod -R 777 或重启整机。
- 涉及数据库、证书、生产环境变量时,标注需要人工确认。

这条可以作为团队排障 Skill。

11. 修复后要让 AI 写部署记录

容器修好后,别马上结束。

让 AI 写:

问题现象。
根因。
验证证据。
修复动作。
是否涉及数据。
是否需要监控。
下次如何避免。

这份记录以后会救你。

因为 Docker 问题很容易反复出现。

尤其是:

环境变量。
端口。
volume。
healthcheck。
depends_on。

这些每个项目都会遇到。

12. 总结

Docker 容器起不来,不要只告诉 AI:

exited。

要给它:

ps。
logs。
config。
env 变量名。
最近变更。
端口映射。
volume。
healthcheck。

通过 4SAPI:

辅助模型整理日志。
Fable 5 判断跨层根因。
复核模型检查危险命令。

最后记住:

Docker 排错先只读验证,不要先删 volume。

下一篇写数据库连接失败。

因为很多容器问题最后都会指向那一句:

app 连接不上 db。