navicat连不上docker中的postgresql,八成卡在host、port、database三项:host需填127.0.0.1或wsl2真实ip而非localhost;port必须与docker run -p左侧宿主机端口一致;database须存在且大小写精确,不能留空。
navicat 连不上 docker 里的 postgresql,八成卡在 host、port、database 这三项上——不是 navicat 有问题,是容器网络和配置没对齐。
host 填 localhost 还是真实 IP?
本地开发时填 localhost 看似合理,但 Docker 容器默认在独立网络里,localhost 指的是 Navicat 所在机器的本机,不是容器内部。Windows 上用 WSL2 或 Docker Desktop 时,localhost 通常能通(Docker Desktop 做了端口转发),但不稳定;更可靠的做法是:
- Linux/macOS:直接填
127.0.0.1(强制走 TCP,避开 Unix socket) - Windows + WSL2:查 WSL2 的 IP(
ip addr show eth0 | grep inet),填那个192.168.x.x地址 - Docker Desktop for Windows/macOS:多数情况
127.0.0.1可用,但若连不上,试试host.docker.internal(仅限 Docker Desktop) - Mac M1/M2:
host.docker.internal支持良好,比localhost更稳
port 和 -p 映射必须严格一致
Docker 启动时用 -p 5432:5432 是把宿主机的 5432 映射到容器内 5432;但很多人改过容器内端口(比如用 -p 5433:5432),却还在 Navicat 里填 5432,结果报 Connection refused。
- 确认命令中
-p左边的端口(宿主机端口)就是 Navicat 的Port字段值 - PostgreSQL 容器内默认监听
5432,不建议改它;只调宿主机映射端口 - 防火墙可能拦住宿主机端口:Linux 用
sudo ufw status,Windows 检查“高级安全 Windows 防火墙”入站规则
database 名必须存在且大小写精确
Navicat 的 Database 字段不能留空,也不能填错。PostgreSQL 对库名大小写敏感——除非建库时用了双引号,否则一律小写。
- 启动容器时加
-e POSTGRES_DB=mydb,那 Navicat 就必须填mydb,不能是MyDB或MYDB - 如果没指定
POSTGRES_DB,容器会创建默认库postgres,但某些镜像(如 bitnami)禁用普通用户连这个库,得显式建新库 - 连上去后执行
SELECT datname FROM pg_database;确认库名拼写 - 错误
FATAL: database "mydb" does not exist就是库不存在,不是密码或权限问题
pg_hba.conf 认证方式不匹配是最隐蔽的坑
输对用户名密码还报 password authentication failed?问题不在 Navicat,而在容器内 PostgreSQL 的 pg_hba.conf 没配好。
- 官方镜像默认用
md5认证,但 bitnami 或自定义镜像可能设成trust(免密)或scram-sha-256(要求 Navicat 15+) - Navicat 不支持
peer或ident这类本地系统认证,pg_hba.conf中对应 host 的 method 必须是md5、scram-sha-256或password - 改完
pg_hba.conf必须 reload:docker exec -it your_pg_container psql -U postgres -c "SELECT pg_reload_conf();" - SSL 模式选错也会断连:云服务(RDS)常强制 SSL,Navicat 得选
require或verify-ca,不能选disable
真正麻烦的不是连不上,而是连上了却查不到表、插不进数据——那多半是 database 字段填错库,或者用户没被授予权限。先确保 psql -U your_user -d your_db 能在命令行跑通,再调 Navicat。











