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

无法从Docker应用服务器容器连接Postgres数据库容器的问题求助

Docker容器间Postgres连接失败的解决思路

核心问题定位

你遇到的Connection to localhost:5432 refused错误,本质是容器内的localhost指向容器自身,而非数据库容器。本地psql能连接是因为通过宿主机端口映射访问,但应用容器处于独立的网络命名空间,无法用localhost访问另一个容器。

关键注意事项与解决步骤

  • 替换数据库连接地址为服务名
    Docker Compose会自动为所有服务创建内部网络,服务名(此处为my-db)可直接解析到对应容器的IP。将应用的数据库连接串中的localhost替换为my-db,示例:

    jdbc:postgresql://my-db:5432/your-db-name
    

    注意使用容器内部的5432端口,而非宿主机映射的端口。

  • 确保Postgres允许跨容器连接
    Postgres默认仅允许本地连接,需调整两个核心配置:

    1. 修改postgresql.conf,设置listen_addresses = '*',让数据库监听所有IP;
    2. 修改pg_hba.conf,添加允许应用容器所在网络访问的规则,示例:
      host all all 0.0.0.0/0 md5
      

    若使用官方Postgres镜像,可通过挂载自定义配置文件,或启动时添加命令行参数修改。

  • 验证容器间网络连通性
    进入应用容器,测试与数据库容器的连通性:

    # 进入应用容器
    docker exec -it <你的应用容器名> sh
    # 测试域名解析是否正常
    ping my-db
    # 测试数据库端口是否开放
    telnet my-db 5432
    

    若ping不通,检查Compose的网络配置;若telnet失败,确认Postgres的监听配置是否生效。

  • 确保数据库就绪后再启动应用
    数据库容器启动需要时间完成初始化,应用可能在数据库未就绪时发起连接导致失败。在Compose中添加健康检查和依赖配置:

    services:
      my-app:
        image: me/my-app-server:1.1-SNAPSHOT
        ports:
          - 127.0.0.1:9000:9000
        environment:
          configEnv: test
        depends_on:
          my-db:
            condition: service_healthy
    
      my-db:
        image: my-db-postgres-test-container
        ports:
          - 127.0.0.1:5432:5432
        healthcheck:
          test: ["CMD-SHELL", "pg_isready -U <你的数据库用户名> -d <你的数据库名>"]
          interval: 5s
          timeout: 5s
          retries: 5
    
  • 核对连接凭证与配置
    确认应用的数据库配置中,用户名、密码、数据库名称完全正确,且对应环境(如test)的配置文件已将连接地址更新为my-db。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:37:37