同一Docker实例下容器间连接PostgreSQL失败求助
Docker Compose容器间连接PostgreSQL失败的修复方案
问题出在这几个地方
- PostgreSQL端口映射配错了:官方postgres镜像默认在容器内部监听
5432端口,但你的docker-compose.yaml里把主机的5434端口映射到了容器的5434端口——容器里的postgres根本没在这个端口监听,自然连不上。 - 容器间连接用错了端口:同一Compose网络里的容器通信,得用容器内部的端口(也就是默认的
5432),不是主机上映射的5434端口。 - 代码里的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
验证方法
- 重启所有容器:
docker-compose down && docker-compose up -d - 看postgres日志确认监听端口:
docker logs raw_data_db,里面应该有listening on IPv4 address "0.0.0.0", port 5432的内容。 - 进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
相关产品推荐
相关产品推荐

