容器起不来先看这三处:docker ps、docker logs 与端口占用
刚接触 Docker 时最常见的一幕:明明执行了 docker run,服务却打不开,容器好像凭空消失了。其实大多数情况不是镜像坏了,而是容器已经退出了,或者端口根本没按你想的那样映射。排查不用大动干戈,先按顺序看三处,十分钟内基本能定位。
第一处:docker ps -a,看容器到底在不在、是什么状态。很多人只敲 docker ps,它默认只列运行中的容器,退出的容器是看不到的,容易误以为“没跑起来”。加上 -a 才能看到全部,重点看 STATUS 一列:Exited (1) 往往是启动命令本身报错退出,Exited (137) 常是被系统杀掉、要怀疑内存不足;Restarting 则说明启动后立刻崩溃又被重启策略拉起来,来回循环。先确认状态,再决定往下查日志还是查资源。
第二处:docker logs,看容器自己说了什么。容器退出前一般都会留下报错,命令是 docker logs --tail 100 <容器名>,只看最后 100 行就够了,太长反而抓不住重点。常见的几类报错都很好认:端口被占用会报 address already in use;配置文件写错会报解析失败并指出行号;数据库类容器常报密码或数据目录权限问题。看到报错原文再去改配置,比凭感觉重启有效得多。如果容器还在 Restarting 循环,日志会不断追加,用 docker logs -f 跟踪几秒就能看到重复出现的同一条错误。
第三处:端口与映射关系。即使容器状态是 Up,浏览器打不开也可能是映射错了。docker ps 里 PORTS 一列写的是映射关系,例如 0.0.0.0:8080->80/tcp 表示宿主机的 8080 转到容器内的 80;如果只看到 80/tcp 而没有箭头,说明启动时根本没加 -p 参数,服务只在容器内部监听,外面当然访问不到。另外注意宿主机端口冲突:两个容器不能同时占同一个宿主机端口,后启动的那个会直接退出,日志里就是 address already in use。
按这个顺序走一遍,还有两个顺手的好习惯。一是给容器起名字,docker run --name 后面再查日志、启停都不用复制容器 ID;二是改配置后先 docker rm 掉旧容器再重新 run,旧容器残留的端口和名字占用经常是“明明改了配置却没生效”的真凶。
总结一下排查口诀:先看状态(docker ps -a),再看日志(docker logs --tail),最后核对端口映射。容器出问题时先别急着删镜像重拉,大多数故障都藏在这三处明明白白的输出里。
- 点赞
- 收藏
- 关注作者
评论(0)