容器中途挂掉主因是内存超限被oomkilled、健康检查失败触发重启策略、或主进程静默退出;需通过docker inspect查exitcode和oomkilled状态,结合docker logs分析panic/connection refused等关键词。
容器中途挂掉,不是没启动,也不是手动停的,而是运行一阵后突然退出——这种“半路崩”最让人头疼。关键不在重启,而在搞清它为什么扛不住。
先看容器到底怎么挂的
别急着重拉,先查它临终状态:
- 用 docker ps -a 找出已退出的容器,记下 ID 或名字
- 执行 docker inspect ,重点看:
– State.Status(是否是 exited)
– State.ExitCode(退出码:0 是正常退出,非 0 多为异常)
– State.OOMKilled(true 表示被系统杀掉,大概率内存爆了) - 再跑 docker logs --tail 100 ,看最后几行有没有 panic、segfault、connection refused、OutOfMemoryError 等关键词
重点盯三类高频“半路崩”原因
很多中途挂掉,其实就卡在这三个地方:
-
内存被杀(OOMKilled):容器没设 memory 限制,或设得太小,应用一涨内存就被宿主机内核强制终止。检查
docker inspect中OOMKilled: true和docker stats历史峰值,再对比--memory设置值 -
健康检查连续失败:虽然容器进程还在跑,但
HEALTHCHECK探针反复超时或返回非 0,Docker 会标记为 unhealthy;若又配了--restart=on-failure,就会触发自动重启→看起来像“挂了又起”,实则是被策略反复拉起又干掉 -
主进程静默退出:比如 Dockerfile 里
CMD ["sh", "-c", "start.sh && wait"]写错了,后台服务启起来,但前台 wait 没兜住,脚本跑完就退出;容器主进程结束,整个容器立刻变为 exited
快速验证是否是资源或依赖问题
临时加点“透视镜”,不改代码也能试出来:
- 进容器看看实时负载:docker exec -it top 或 htop(如无,可临时装:
apt update && apt install -y procps) - 测试关键依赖是否还通:docker exec curl -I http://依赖服务:端口/health,确认不是下游挂导致上游主动退出
- 检查挂载卷是否还可用:docker exec ls -l /data + touch /data/test.tmp && rm -f /data/test.tmp,避免因 NFS 断连或权限变更引发写入失败崩溃
留一手:让挂掉的现场不消失
下次再挂,别让它悄无声息:
- 启动时加 --restart=on-failure:5,至少保留最近 5 次失败实例供 inspect
- 日志别只靠
docker logs,在docker run或docker-compose.yml里指定--log-driver=json-file --log-opt max-size=10m --log-opt max-file=3,防止日志被覆盖 - 对关键容器,在启动命令前加
exec包裹,例如:CMD exec /bin/sh -c 'your-app && wait',确保 shell 始终是 PID 1,能正确接收信号











