端口冲突怎么排查
宿主机端口被占用时容器起不来,报错常见绑定失败或端口已被分配。原因通常有三类:旧容器没删干净、宿主机上已有进程占用、另一个 compose 项目用了同一端口。先用 ss 找到占用者,再决定换端口还是清理。
基本信息
| 报错特征 | 守护进程返回端口已被分配或绑定失败 |
|---|---|
| 找占用 | ss -lntp | grep 8080,或 lsof -i :8080 |
| 常见元凶 | 旧容器残留、宿主进程、另一个 compose 项目 |
| 按容器查 | docker ps -a --filter publish=8080 |
| 容器内冲突 | 同一网络命名空间里两个进程抢端口,表现为容器起不来 |
| 处置 | 停旧容器、改宿主端口或调整映射 |
排查路径
| 现象 | 先查 | 处置 |
|---|---|---|
| 启动即报端口已分配 | 用 ss 找占用进程 | 停旧容器或换端口 |
| 只有部分环境报错 | 另一个 compose 项目占用 | 改项目端口或统一规划 |
| 换端口后仍不通 | 应用是否监听新端口 | 同步修改应用配置 |
| Pod 内两个容器互抢 | 是否共享网络命名空间 | 改监听端口或拆成两个 Pod |
定位与处置
定位与处置
ss -lntp | grep :8080 # 看谁在监听 8080
docker ps -a --filter publish=8080 # 找出发布该端口的容器
docker rm -f old-web # 清理残留容器
docker run -d -p 8081:80 --name web nginx:1.27 # 换宿主端口重启典型使用场景
- 部署时容器起不来报绑定失败,需要快速定位占用者
- 同机跑多个项目,端口规划冲突后统一调整映射
- 排查线上服务异常重启,确认是否端口被其他进程抢占
- 从单机容器迁移到编排平台前梳理端口占用关系
先确认占用者是容器还是宿主进程:前者删容器即可,后者要改服务配置或换端口,处理方式完全不同。
换宿主端口只是改映射,容器内应用监听的端口不变;若同时改了应用配置,要让镜像内的监听端口与映射目标保持一致。
在编排平台里同一 Pod 的多个容器共享网络命名空间,端口冲突会直接让容器起不来,排查要看 Pod 事件与容器日志两个地方。