Docker部署PostgreSQL后宿主机外部连接失败求助
问题排查与解决
1. 解析dial tcp: lookup db on x.x.x.x:53: no such host错误
db是Docker Compose为容器分配的内部网络别名,仅在Docker创建的专属网络内(同Compose文件的其他容器)才能被解析。宿主机不在这个网络中,所以无法通过db访问容器。
解决方式:
- 宿主机连接时,必须使用
localhost/宿主机IP作为Host,同时使用映射到宿主机的端口5433(而非容器内部的5432)。
2. 解决localhost/127.0.0.1连接时的认证错误
认证错误通常和PostgreSQL的访问控制规则或用户权限有关,按以下步骤排查:
步骤1:确认连接参数正确性
检查你的main.go数据库配置:
- Host:
localhost或127.0.0.1 - Port:
5433(必须是docker-compose映射的宿主机端口) - Username:
tickets - Password:和docker-compose中设置的
POSTGRES_PASSWORD一致 - Database:对应创建的数据库名(默认和用户名相同,除非自定义)
步骤2:检查PostgreSQL访问控制规则(pg_hba.conf)
进入PostgreSQL容器:
docker exec -it <你的容器名或ID> sh
查看pg_hba.conf配置:
cat /var/lib/postgresql/data/pg_hba.conf
确认是否存在允许宿主机连接的规则,比如:
host all all 0.0.0.0/0 scram-sha-256
如果没有,添加该规则(或限制为宿主机网段,比如192.168.1.0/24),然后重启容器:
docker restart <你的容器名或ID>
步骤3:确认tickets用户的登录权限
进入容器的psql:
docker exec -it <你的容器名或ID> psql -U tickets
执行查询查看用户权限:
SELECT usename, host FROM pg_user;
如果tickets的host字段是localhost,说明该用户仅允许从容器内部登录,需要修改为允许任意地址:
ALTER USER tickets WITH LOGIN PASSWORD '你的密码' HOST '%';
修改后退出psql,重启容器生效。
步骤4:验证连接
在宿主机直接用psql测试连接(需先安装postgresql-client):
psql -h localhost -p 5433 -U tickets -d <你的数据库名>
如果能成功登录,说明配置正常,再调整main.go的参数即可。
内容的提问来源于stack exchange,提问作者sato-kaso
相关产品推荐
相关产品推荐

