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

同一Docker实例下容器间连接PostgreSQL失败求助

Docker Compose容器间连接PostgreSQL失败的修复方案

问题出在这几个地方

  1. PostgreSQL端口映射配错了:官方postgres镜像默认在容器内部监听5432端口,但你的docker-compose.yaml里把主机的5434端口映射到了容器的5434端口——容器里的postgres根本没在这个端口监听,自然连不上。
  2. 容器间连接用错了端口:同一Compose网络里的容器通信,得用容器内部的端口(也就是默认的5432),不是主机上映射的5434端口。
  3. 代码里的host可能没统一:错误信息显示你试过连localhost,但容器里的localhost指的是容器自己,不是postgres容器,肯定连不上。

按下面的步骤改就行

1. 修正Docker Compose里的PostgreSQL端口

把raw_data_db服务的ports改成这样:

ports:
  - "5434:5432"

这样主机的5434端口对应容器内postgres的默认5432端口,既不影响你外部连接,也能让容器之间正常通信。

2. 改Python连接代码的端口

连接代码里的端口换成5432,同时确保host用服务名raw_data_db:

conn = psycopg2.connect(
    database="raw_data",
    user="my_username",
    password="my_password",
    host="raw_data_db",
    port="5432"
)

3. 给服务加依赖(可选但更稳妥)

给producer和consumer加上对raw_data_db的依赖,避免启动顺序问题导致的连接失败。另外给postgres加个健康检查,确保它完全就绪后再启动其他服务:

先给raw_data_db加健康检查:

raw_data_db:
  image: postgres:latest
  container_name: raw_data_db
  environment:
    POSTGRES_DB: raw_data
    POSTGRES_USER: my_username
    POSTGRES_PASSWORD: my_password
  ports:
    - "5434:5432"
  volumes:
    - /path/to/store/data:/var/lib/postgresql/data
  healthcheck:
    test: ["CMD-SHELL", "pg_isready -U my_username -d raw_data"]
    interval: 5s
    timeout: 5s
    retries: 5

然后给producer和consumer加依赖条件:

producer:
  build:
    context: .
    dockerfile: ./DockerfileProducer
  volumes:
    - ./producer.py:/app/producer.py
    - ./data_cleaned_1000.csv:/app/data_cleaned_1000.csv
  command: sh -c "python /app/producer.py"  # 有健康检查的话可以去掉sleep
  depends_on:
    broker:
      condition: service_started
    raw_data_db:
      condition: service_healthy

consumer:
  build:
    context: .
    dockerfile: ./DockerfileConsumer
  volumes:
    - ./consumer.py:/app/consumer.py
  command: sh -c "python /app/consumer.py"  # 去掉sleep
  depends_on:
    broker:
      condition: service_started
    raw_data_db:
      condition: service_healthy

验证方法

  1. 重启所有容器:docker-compose down && docker-compose up -d
  2. 看postgres日志确认监听端口:docker logs raw_data_db,里面应该有listening on IPv4 address "0.0.0.0", port 5432的内容。
  3. 进consumer容器测试连接:
docker exec -it <你的consumer容器名> bash
pip install psycopg2-binary
python -c "import psycopg2; conn = psycopg2.connect(database='raw_data', user='my_username', password='my_password', host='raw_data_db', port='5432'); print('连接成功'); conn.close()"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:28:27