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
相关产品推荐
相关产品推荐

