首页/云/Docker 容器速查/端口冲突 address already in use
容器排障52 条

端口冲突 address already in use

绑定已占用端口时 docker run 报 bind: address already in use(或 userland proxy 报错):先找谁占了端口——其他容器或宿主进程。

Docker 容器速查云更新于 2026-10-13

报错从哪里来

docker run 发布端口时,如果宿主端口已被占用,会报 bind: address already in use,也可能出现 userland proxy 相关的报错。占用方通常是另一个发布了同一宿主端口的容器,或者是宿主上直接监听的进程。排查的目标始终是宿主端口这一侧的占用者,而不是容器内部的端口。

基本信息

报错形态bind: address already in use / userland proxy listen 失败
排查方向容器端口映射与宿主进程(含 docker-proxy)
处置方式改映射端口或停掉占用方
常见冲突端口80、443、8080、3306
适用平台Docker Engine(Linux 宿主)

典型使用场景

  • 新版本容器启动失败,旧容器仍在占用同一宿主端口
  • 宿主上装了 nginx 或数据库,与容器的映射端口撞车
  • CI 并行任务抢占同一宿主端口
  • 排查「昨天还能起、今天起不来」的端口变化
  • 迁移前先确认目标宿主端口是否空闲

定位与处置

定位与处置
docker ps -a --format '{{.Names}} {{.Ports}}' | grep 8080   # 哪个容器发布了该端口
ss -ltnp | grep 8080                                        # 宿主上谁在监听
sudo lsof -i :8080                                          # 进一步确认进程
docker run -d -p 8081:80 --name web nginx:1.27              # 改用空闲宿主端口
curl -sI localhost:8081 | head -1                            # 验证新映射可用

现象与处置

现象含义处置
bind: address already in use宿主端口被占用停掉占用方或改宿主端口
userland proxy listen 报错Docker 转发进程起不来先看残留的转发进程与容器状态
端口开着但访问报错映射方向写反或应用未监听按宿主:容器顺序核对
host 网络下映射无效host 模式忽略发布参数直接排查宿主端口占用
docker-proxy 是 Docker 自己的端口转发进程,停掉它会破坏对应容器的端口发布,排查时不要顺手清理它。
同一宿主上两个容器各自发布不同的宿主端口不会冲突,冲突永远发生在宿主端口这一侧。

减少冲突的做法

  • 给每个服务分配固定且不重复的宿主端口段,写进运维文档
  • 内部服务不发布端口,交给同网络的反向代理访问
  • CI 里用随机端口或每次运行前先探测端口占用
  • 排查时先看容器映射清单,再看宿主监听进程,顺序反了容易漏

易错点

  • 以为容器内的端口会互相冲突:真正冲突的是宿主机端口,各容器有独立的网络命名空间
  • 直接 kill 掉转发进程来「解决」冲突:会把其他正常容器的端口发布一起弄坏
  • 忽略宿主自身的服务:宿主上运行的 nginx、MySQL 同样占用 80、3306 等端口
  • 端口映射方向写反:-p 80:8080 会让宿主监听 80 而容器内 8080 无人监听,表现为「连着但没响应」

数据来源与参考

  • Docker 官方文档:port publishing 与 userland proxy(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌