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

Python容器连接PostgreSQL容器报Connection refused错误如何解决?

问题原因与解决方法

你遇到的连接报错核心是容器间网络访问的地址配置错误,以下是具体排查步骤和解决方案:

直接解决方案

将连接代码中的host参数从0.0.0.0改为docker compose中PostgreSQL服务的服务名db即可,修正后的代码如下:

import psycopg2
conn = psycopg2.connect(database="ps_db", user="ps_user", password="ps_pass", host="db", port=5432)

报错原因说明

  • 0.0.0.0是服务绑定所有网卡的监听地址,不能作为访问其他服务的目标地址
  • Docker Compose会为同一配置下的所有服务自动创建专属内部网络,并且用服务名作为DNS解析域名,因此web容器可以直接通过db这个域名访问到PostgreSQL服务,不需要走宿主机的端口映射。
  • 只有你在宿主机本地访问PostgreSQL的时候,才可以用127.0.0.1作为host,调用你映射的5432端口。

通用排查步骤

如果修改地址后还是报错,可以按以下顺序排查:

  • 确认PostgreSQL容器正常运行
    执行命令docker compose ps查看db服务的状态是否为Up,如果状态异常可以执行docker compose logs db查看服务启动日志排查错误。
  • 验证容器间网络连通性
    执行docker compose exec web bash进入Jupyter容器内部,执行ping db验证域名解析是否正常,执行nc -zv db 5432验证PostgreSQL端口是否可访问。
  • 解决服务启动顺序问题
    配置中的depends_on仅保证容器启动顺序,不保证PostgreSQL完成初始化、可以接受连接,启动后立刻访问可能会临时报错,可以等待3-5秒重试,也可以在docker-compose.yml中添加健康检查保证服务就绪后再启动Jupyter:
    version: '3'
    services:
      db:
        image: postgres:12.1-alpine
        environment:
          - POSTGRES_DB=ps_db
          - POSTGRES_USER=ps_user
          - POSTGRES_PASSWORD=ps_pass
        ports:
          - "5432:5432"
        # 新增健康检查配置
        healthcheck:
          test: ["CMD-SHELL", "pg_isready -U ps_user -d ps_db"]
          interval: 5s
          timeout: 5s
          retries: 5
      web:
        build: 
          context: .
        command: 
          jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser --allow-root
        volumes:
          - .:/project
        ports:
          - "8888:8888"
        # 修改依赖条件,等待db服务健康后再启动
        depends_on:
          db:
            condition: service_healthy
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:24:04