排查方法论
核心原则:先看状态,再查日志,由表及里。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 列的数字是退出码,它直接告诉你大方向。
容器起不来
症状是docker run 后容器秒退,或一直重启。先按方法论走,看退出码、查日志。最常见的原因:
容器的设计是「一个前台进程」。守护进程式写法都要改成前台运行,例如 nginx 加
-g "daemon off;"。端口冲突
症状是docker run 报错 bind: address already in use,意思是宿主机端口被占了。
docker compose down 再 docker compose up -d。
磁盘撑爆
镜像、容器、构建缓存都在吃磁盘,症状是构建失败、容器写文件报错。先看占用分布:.dockerignore、用多阶段构建压镜像体积、给日志配轮转,参见 Docker 日志与监控。
网络不通
容器间网络不通,按这条链路排查:默认
bridge 网络上的容器不能用容器名互相解析,只能用 IP。需要服务发现就建自定义网络,这是最常见的坑。DNS 解析失败
症状是容器里域名解析不了,提示Temporary failure in name resolution。两种修法。
容器级临时修:
/etc/docker/daemon.json:
sudo systemctl restart docker 生效。公司内网环境通常要填内网 DNS 地址。
镜像拉取失败
docker pull 失败,按三类原因排查。
第一类是网络问题,报错含 timeout、connection refused。国内环境配置镜像加速器:
unauthorized。私有仓库先登录再拉:
not found 或 manifest unknown:
延伸阅读
- Docker 日志与监控:用日志和监控手段定位问题
- Docker 网络:网络模型详解,网络故障的根
- Docker 存储:卷与挂载,磁盘问题的背景知识
- Kubernetes 故障排查:集群环境的排查方法论