Docker无直接排查宿主机端口冲突的命令,需结合lsof/netstat查系统占用、docker ps查运行容器映射、docker port验证单个容器端口,并识别IP绑定、服务监听地址、防火墙及网络模式等转发错误。

没有 docker port 命令能直接“排查宿主机端口冲突”,它只能查看**已运行容器**的端口映射关系,不能检测端口是否被占用或是否存在转发错误。真正有效的排查必须结合系统级命令和 Docker 自身状态检查。
一、先确认目标端口是否被宿主机占用
这是最常被跳过的一步。即使没运行任何 Docker 容器,Nginx、MySQL、VS Code Server 或其他本地进程都可能监听 80、3306、5000 等常见端口。
- 查指定端口(如 8080)谁在用:
lsof -i :8080(macOS / Linux)或sudo netstat -tulnp | grep :8080(Linux,需 root 权限) - 输出中重点关注 PID 和 COMMAND 列,判断是 Docker 进程(如
docker-proxy)、普通服务(如nginx),还是开发工具(如node) - 若看到
docker-proxy占用,说明有容器正在使用该端口,需继续查是哪个容器
二、用 docker ps 查清哪些容器在用这个端口
docker ps 是定位 Docker 内部冲突的核心命令,但默认不显示端口。必须加格式化参数才能看清映射关系。
- 列出所有运行中容器及其端口绑定:
docker ps --format "table {{.Names}}\t{{.Ports}}" - 重点看 {{.Ports}} 列,例如
0.0.0.0:8080->80/tcp表示宿主机 8080 映射到容器 80 端口 - 若发现多个容器都含
:8080->,就是典型 Docker 内部端口冲突 - 补充检查已停止但未删除的容器(可能残留网络配置):
docker ps -a | grep -E "(Exited|Created)"
三、用 docker port 查具体容器的映射细节
docker port 不是用来“扫描冲突”的,而是验证某个容器是否按预期暴露了端口。
- 例如:
docker port web-server输出80/tcp -> 0.0.0.0:8080,说明它确实在用宿主机 8080 - 如果输出为空,代表该容器启动时没加
-p,或用了--network host模式(此时不走端口映射) - 若提示
Error: No public port '80/tcp' published for ...,说明映射配置缺失或容器未运行
四、识别常见转发错误场景
端口“能启动但访问不通”,往往是转发链路出问题,不只是端口冲突。
-
IP 绑定范围错误:比如
-p 127.0.0.1:8080:80只允许本机访问,外部请求失败 -
容器内服务未监听 0.0.0.0:应用只监听
localhost:80,导致 Docker 无法转发(应监听0.0.0.0:80) - 防火墙拦截:Ubuntu 的 ufw、CentOS 的 firewalld 或云服务器安全组可能屏蔽了端口
-
Docker 网络模式混淆:用了
--network none或自定义 bridge 但未正确配置网关和 DNS











