Docker容器访问本地PostgreSQL数据库的连接问题排查
解决Docker容器连接Ubuntu宿主PostgreSQL的问题
问题根源
容器内的127.0.0.1指向容器自身的回环地址,而非Ubuntu宿主;而host.docker.internal在Ubuntu版Docker中默认未启用,导致域名解析失败。
可行解决方案
方案一:使用宿主实际IP连接
- 查看Ubuntu宿主的局域网IP:
找到对应网卡(如ip addr showeth0或wlan0)的inet字段,比如192.168.1.100。 - 修改Python代码中的数据库连接配置,将
host设为上述IP。 - 配置PostgreSQL允许Docker网段访问:
- 编辑
pg_hba.conf(路径通常为/etc/postgresql/<版本>/main/pg_hba.conf),添加一行:
(Docker默认桥接网段为host all all 172.17.0.0/16 md5172.17.0.0/16,若自定义过网段需对应修改) - 重启PostgreSQL服务:
sudo systemctl restart postgresql
- 编辑
- 确保宿主防火墙开放5432端口:
sudo ufw allow 5432/tcp
方案二:使用Docker host网络模式
运行容器时直接共享宿主网络空间,此时容器内的127.0.0.1等价于宿主的回环地址:
docker run --rm --network host webhook_receiver &
注意:该模式下无需使用
-p 5000:5000端口映射,容器应用直接使用宿主的5000端口。
方案三:启用host.docker.internal解析
- 编辑Docker配置文件
/etc/docker/daemon.json,添加以下内容:{ "extra_hosts": ["host.docker.internal:host-gateway"] } - 重启Docker服务:
sudo systemctl restart docker - 重新运行容器,此时代码中使用
host.docker.internal即可连接到宿主的PostgreSQL。
额外检查项
- 确认Ubuntu宿主上的PostgreSQL服务正常运行:
sudo systemctl status postgresql - 验证宿主的5432端口可被访问:
telnet <宿主IP> 5432
内容的提问来源于stack exchange,提问作者Petlya0000
相关产品推荐
相关产品推荐

