Skip to main content
容器出问题不要慌。Docker 的故障大多有固定套路,按方法论走一遍,十有八九能定位。本文给你一套排查流程和常见故障的逐个击破方案。

排查方法论

核心原则:先看状态,再查日志,由表及里
1

看容器状态

docker ps -a 看容器在不在、什么状态、退出码多少,重点看 STATUS 列,例如 Exited (137)
2

查容器详情

docker inspect 看配置和环境。挂载对不对、环境变量漏没漏、OOMKilled 是不是 true,都在这里。
3

读容器日志

docker logs --tail 200 -t my-app 看应用自己说了什么。大部分应用错误日志里都有答案。
4

进容器验证

日志看不出问题就执行 docker exec -it my-app sh 进容器手动验证,DNS、网络、文件权限都可以现场试。

容器退出码速查表

docker ps -a 里 STATUS 列的数字是退出码,它直接告诉你大方向。
看到 137 先查 docker inspect 的 OOMKilled 字段。是 true 就说明内存超限被杀,去加内存限额或优化应用。

容器起不来

症状是 docker run 后容器秒退,或一直重启。先按方法论走,看退出码、查日志。最常见的原因:
容器的设计是「一个前台进程」。守护进程式写法都要改成前台运行,例如 nginx 加 -g "daemon off;"

端口冲突

症状是 docker run 报错 bind: address already in use,意思是宿主机端口被占了。
Compose 项目里还可能是旧容器没删干净,先 docker compose downdocker compose up -d

磁盘撑爆

镜像、容器、构建缓存都在吃磁盘,症状是构建失败、容器写文件报错。先看占用分布:
再按需清理:
prune 系命令不可逆。删掉的镜像要重新拉,删掉的卷数据直接丢失,执行前确认没有重要数据。
根治办法:构建加 .dockerignore、用多阶段构建压镜像体积、给日志配轮转,参见 Docker 日志与监控

网络不通

容器间网络不通,按这条链路排查:
默认 bridge 网络上的容器不能用容器名互相解析,只能用 IP。需要服务发现就建自定义网络,这是最常见的坑。

DNS 解析失败

症状是容器里域名解析不了,提示 Temporary failure in name resolution。两种修法。 容器级临时修:
Daemon 级全局修,编辑 /etc/docker/daemon.json:
改完执行 sudo systemctl restart docker 生效。公司内网环境通常要填内网 DNS 地址。

镜像拉取失败

docker pull 失败,按三类原因排查。 第一类是网络问题,报错含 timeoutconnection refused。国内环境配置镜像加速器:
第二类是凭证问题,报错含 unauthorized。私有仓库先登录再拉:
第三类是名字拼错,报错含 not foundmanifest unknown:

延伸阅读