You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Docker Compose容器访问宿主机上的PostgreSQL数据库?

解决Docker容器连接主机PostgreSQL超时的步骤
  • 检查PostgreSQL监听地址配置
    编辑PostgreSQL主配置文件(路径通常为/etc/postgresql/<你的PostgreSQL版本>/main/postgresql.conf),找到listen_addresses参数,修改为:

    listen_addresses = '*'
    

    该配置允许PostgreSQL监听所有网络接口,保存后重启服务:

    sudo systemctl restart postgresql
    
  • 修改pg_hba.conf授权Docker网段访问
    编辑/etc/postgresql/<你的PostgreSQL版本>/main/pg_hba.conf,添加针对Docker常用网段的访问规则(172.17.0.0/16是Docker默认桥接网段,可根据实际情况调整):

    host    mydb         xx          172.17.0.0/16        scram-sha-256
    host    mydb         xx          192.168.0.0/16        scram-sha-256
    

    其中mydb是你的目标数据库名,xx是数据库用户名,认证方式(scram-sha-256)需和PostgreSQL配置一致。保存后重启PostgreSQL服务:

    sudo systemctl restart postgresql
    
  • 开放主机防火墙5432端口
    Ubuntu默认使用ufw防火墙,执行以下命令允许Docker网段访问5432端口:

    sudo ufw allow from 172.17.0.0/16 to any port 5432
    sudo ufw allow from 192.168.0.0/16 to any port 5432
    sudo ufw reload
    

    若使用iptables,替换为:

    sudo iptables -A INPUT -p tcp -s 172.17.0.0/16 --dport 5432 -j ACCEPT
    sudo iptables -A INPUT -p tcp -s 192.168.0.0/16 --dport 5432 -j ACCEPT
    sudo iptables-save
    
  • 验证容器内网络连通性
    进入.NET Core容器内部,测试与主机的网络连通性:

    docker exec -it <你的容器名称> /bin/bash
    # 测试ping主机
    ping host.docker.internal
    # 测试5432端口是否可访问
    telnet host.docker.internal 5432
    

    如果telnet无法连接,说明网络层面存在阻塞,需回到前面的配置排查。

  • 调整连接字符串参数
    若PostgreSQL未配置SSL,在连接字符串中添加SslMode=Disable避免SSL握手超时:

    Server=host.docker.internal;Port=5432;Database=mydb;User Id=xx;Password=xx;SslMode=Disable;
    

内容的提问来源于stack exchange,提问作者raklos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 10:25:20