无法连接Docker容器内Postgres实例 访问到错误实例如何解决
问题根因
你连不上容器内Postgres、始终连到其他实例的原因有两个:
- 连接命令参数错误:你执行的
psql -U localhost -p 5432 -U postgres重复指定了两次-U(用户参数),全程没有加-h(主机地址)参数。psql客户端如果不指定-h,在Windows环境下不会走TCP协议连接本地端口,而是通过命名管道直连本机安装的PostgreSQL服务,完全不会触达Docker映射的端口。 - 端口冲突:你本地已经安装了PostgreSQL 14.4,该服务默认会占用5432端口,你执行
docker run -p 5432:5432时,Docker实际上无法成功绑定宿主机5432端口,端口映射规则不生效。你可以执行netstat -ano | findstr :5432验证,占用5432端口的进程是本地Postgres服务,而非Docker的端口转发进程。
解决步骤
方案一:停掉本地Postgres服务,继续用5432端口映射
- 开管理员权限PowerShell,执行命令停掉本地Postgres服务:
Stop-Service postgresql-x64-14 - 重启你的Postgres容器让端口映射生效:
docker restart postgres-0 - 用正确参数连接,必须显式指定主机为localhost:
psql -h localhost -p 5432 -U postgres
密码填你启动容器时设置的password即可。
- 开管理员权限PowerShell,执行命令停掉本地Postgres服务:
方案二:保留本地Postgres运行,更换容器映射端口
- 删除原有冲突的容器:
docker rm -f postgres-0 - 启动新容器,将宿主机映射端口改为未被占用的5433:
docker run --name postgres-0 -e POSTGRES_PASSWORD=password -d -p 5433:5432 postgres:latest - 用对应端口连接:
psql -h localhost -p 5433 -U postgres
- 删除原有冲突的容器:
连接验证
连接成功后执行SQL命令select version();,如果返回结果中包含PostgreSQL 14.3 (Debian 14.3-1.pgdg110+1)字样,就说明已经正确连接到容器内的Postgres实例,此时执行\l就能看到你之前创建的test数据库。
内容的提问来源于stack exchange,提问作者IDK
相关产品推荐
相关产品推荐

