端口冲突本质是宿主机端口被其他进程或容器独占导致映射失败;需优先用lsof -i :端口或netstat -tulnp | grep :端口查占用进程,再检查docker ps -a中已停止但未删除的容器,最后核对Docker Compose配置及宿主机原有服务是否重叠。
端口冲突不是 docker 自身出问题,而是宿主机端口被占导致容器无法映射。排查关键在三步:查谁在用、查哪些容器在用、查配置有没有重复写。
查宿主机端口被哪个进程占用
这是最优先的操作。看到 port is already allocated 或 Bind for 0.0.0.0:xxx failed,立刻执行:
-
Linux/macOS:
sudo lsof -i :8080(把 8080 换成你要查的端口),输出里看 PID 和 COMMAND - 或者用:
sudo netstat -tulnp | grep :8080,重点关注 LISTEN 状态那一行 - 如果 COMMAND 是
docker-proxy,说明是另一个容器占着;如果是nginx、node、python,就是宿主机原生服务在抢
查当前运行中容器的端口映射情况
快速确认是不是自己启动的其他容器已先占了路:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
-
docker ps --format "table {{.Names}}\t{{.Ports}}\t{{.Status}}"—— 列出所有运行中容器的名称、端口和状态 -
docker-compose ps(在项目目录下)—— 只看当前 compose 项目的端口绑定 - 注意:
docker ps不显示已停止但未删除的容器,它们也可能残留端口,需额外检查docker ps -a
查有没有残留容器还在绑定端口
很多人以为 docker stop 就释放了端口,其实没删干净的容器仍可能维持网络引用:
-
docker ps -a查所有容器,重点看 Status 为 Exited 但曾用过 -p 映射 的 - 执行
docker container prune清理所有已停止容器(无数据风险) - 若要精准清理某个:
docker rm -f 容器名
查 Docker Compose 配置是否重复声明端口
多项目共存时,硬编码 ports: ["8080:80"] 极易撞车:
- 打开
docker-compose.yml,逐个检查 ports 字段 - 确认不同 service 之间没有同时声明同一个宿主机端口(比如两个都写
"8080:80") - 开发阶段建议改用动态映射:
-p 80(不写宿主机端口),让 Docker 自动选空闲端口

















