如何从Docker容器内部访问宿主机本地运行的PostgreSQL数据库?
Linux环境Docker容器访问宿主机PostgreSQL失败排查方案
必查配置项
- PostgreSQL监听地址配置
编辑postgresql.conf文件(默认路径/var/lib/postgresql/<版本号>/main/postgresql.conf),将listen_addresses参数从默认的'localhost'修改为'*'或者包含Docker网桥网段的地址,修改后重启PostgreSQL服务生效。 - PostgreSQL访问权限配置
编辑pg_hba.conf文件(同目录下),新增规则允许Docker容器网段访问,Docker默认网桥网段为172.17.0.0/16,参考配置如下:
加密方式根据你的PostgreSQL配置选择host all all 172.17.0.0/16 scram-sha-256scram-sha-256或者md5,修改后同样需要重启PostgreSQL服务。 - 防火墙端口放行
检查Linux系统防火墙(ufw/firewalld)是否放行5432端口的Docker网段访问,以ufw为例,执行命令:ufw allow in from 172.17.0.0/16 to any port 5432 - host映射生效验证
进入运行的容器内部,执行cat /etc/hosts确认host.docker.internal是否正确映射到宿主机的Docker网关地址(默认是172.17.0.1),也可以直接在连接字符串中将地址替换为172.17.0.1测试是否连通。 - 容器内部连通性测试
你之前的pg_isready测试如果是在宿主机执行的,不代表容器内部可以连通,需要进入容器内部执行对应命令验证:pg_isready -d DbName -h host.docker.internal -p 5432 -U DbUser
若返回正常响应才说明网络链路是通的,否则优先排查前面的网络和PG配置项。
补充说明
如果使用Docker Compose部署,需要在对应服务的配置下添加extra_hosts参数,写法如下:
services: your-dotnet-api: image: your-api-image extra_hosts: - "host.docker.internal:host-gateway" # 其余配置省略
内容的提问来源于stack exchange,提问作者George Wurthmann
相关产品推荐
相关产品推荐

