Docker Compose部署Golang后端、PostgreSQL及Redis服务时,后端连接PostgreSQL失败的问题求助
Docker Compose部署Golang后端、PostgreSQL及Redis服务时,后端连接PostgreSQL失败的问题求助
嗨,我来帮你排查这个连接失败的问题~你遇到的connection refused错误主要有两个关键原因,咱们一步步解决:
1. 数据库连接地址配置错误
在Docker Compose的bridge网络中,每个容器都是独立的网络个体,你后端代码里用的127.0.0.1:5433指向的是后端容器自己,而不是PostgreSQL容器。正确的做法是:
- 把连接地址的host改成
db(也就是你docker-compose.yml里PostgreSQL服务的名称,Docker会自动解析这个服务名到对应的容器IP) - 端口用容器内部的
5432,而不是映射到宿主机的5433(宿主机端口是给外部访问用的,容器之间通信直接用容器内部端口)
举个例子,你的Golang数据库DSN应该改成类似这样:
dsn := "postgres://postgres:123@db:5432/postgres?sslmode=disable"
2. 数据库未完全就绪就发起连接
虽然你在后端服务里加了depends_on: - db,但这个配置只是保证db容器先启动,不代表PostgreSQL服务已经完成初始化、可以接受连接了。当后端启动时,数据库可能还在加载初始化脚本,这时候就会出现连接拒绝。
你可以给PostgreSQL服务加上健康检查,让Docker确认数据库就绪后再启动后端。修改后的docker-compose.yml片段如下:
services: db: image: postgres:15.7 restart: always network_mode: bridge volumes: - ./db/table.sql:/docker-entrypoint-initdb.d/init.sql ports: - '5433:5432' environment: POSTGRES_DB: postgres POSTGRES_USER: postgres POSTGRES_PASSWORD: 123 # 添加健康检查,确认数据库就绪 healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d postgres"] interval: 5s timeout: 5s retries: 5 redis: image: redis:7.0.12 network_mode: bridge ports: - '6380:6379' backend: build: ./backend network_mode: bridge ports: - '8000:8089' depends_on: db: # 依赖db的健康检查状态,确保数据库就绪后再启动 condition: service_healthy
额外检查点
- 确认你的
./db/table.sql初始化脚本没有语法错误,避免数据库初始化失败 - 可以手动进入PostgreSQL容器,用
psql命令测试是否能正常连接,验证数据库本身没问题:
docker exec -it <你的db容器ID> psql -U postgres -d postgres
按照上面的步骤修改后,应该就能解决连接拒绝的问题啦~
备注:内容来源于stack exchange,提问作者Vali
相关产品推荐
相关产品推荐

