问题:
我在window是环境下 宿主机安装了postgres 16,启动后并成功创建链接,
然后用docker 部署了 posgres18 ,启动后,指定端口 5432:5432. 也启动成功了。
通过navicat 链接 localhost:5432服务,
连接到了postgres16. 关闭 postgres16 服务后,
再次链接链接到了 postgres18 .这是为什么两个服务用一个端口还不冲突?
回答:
这是一个非常典型、而且很多人在 Windows + Docker + PostgreSQL 场景下都会困惑的问题 。
结论先行,然后我用端口、网络、进程层面给你一次性讲清楚
一句话结论(核心原因)
Docker 容器里的 PostgreSQL 并不是直接占用 5432 端口的
真正占用 5432 的只有一个进程:要么是宿主机的 Postgres,要么是 Docker Desktop 的端口转发代理
所以你看到的现象是:
-
宿主机 Postgres 16 运行时 → 它抢占 5432
-
Docker Postgres 18 运行着,但 5432 转发被"挡住"
-
你连
localhost:5432→ 实际连的是 宿主机 Postgres 16 -
关掉宿主机 Postgres 16 → 5432 空出来
-
Docker 的端口映射立即生效 → 你连到了 容器里的 Postgres 18
工程级总结(重点)
-
端口 不可能 真正被两个进程同时监听
-
Docker 容器并不直接监听宿主端口
-
Windows Docker Desktop 有端口转发中间层
-
你看到的是端口归属切换,不是共存