无法从Docker应用服务器容器连接Postgres数据库容器的问题求助
Docker容器间Postgres连接失败的解决思路
核心问题定位
你遇到的Connection to localhost:5432 refused错误,本质是容器内的localhost指向容器自身,而非数据库容器。本地psql能连接是因为通过宿主机端口映射访问,但应用容器处于独立的网络命名空间,无法用localhost访问另一个容器。
关键注意事项与解决步骤
替换数据库连接地址为服务名
Docker Compose会自动为所有服务创建内部网络,服务名(此处为my-db)可直接解析到对应容器的IP。将应用的数据库连接串中的localhost替换为my-db,示例:jdbc:postgresql://my-db:5432/your-db-name注意使用容器内部的5432端口,而非宿主机映射的端口。
确保Postgres允许跨容器连接
Postgres默认仅允许本地连接,需调整两个核心配置:- 修改
postgresql.conf,设置listen_addresses = '*',让数据库监听所有IP; - 修改
pg_hba.conf,添加允许应用容器所在网络访问的规则,示例:host all all 0.0.0.0/0 md5
若使用官方Postgres镜像,可通过挂载自定义配置文件,或启动时添加命令行参数修改。
- 修改
验证容器间网络连通性
进入应用容器,测试与数据库容器的连通性:# 进入应用容器 docker exec -it <你的应用容器名> sh # 测试域名解析是否正常 ping my-db # 测试数据库端口是否开放 telnet my-db 5432若ping不通,检查Compose的网络配置;若telnet失败,确认Postgres的监听配置是否生效。
确保数据库就绪后再启动应用
数据库容器启动需要时间完成初始化,应用可能在数据库未就绪时发起连接导致失败。在Compose中添加健康检查和依赖配置:services: my-app: image: me/my-app-server:1.1-SNAPSHOT ports: - 127.0.0.1:9000:9000 environment: configEnv: test depends_on: my-db: condition: service_healthy my-db: image: my-db-postgres-test-container ports: - 127.0.0.1:5432:5432 healthcheck: test: ["CMD-SHELL", "pg_isready -U <你的数据库用户名> -d <你的数据库名>"] interval: 5s timeout: 5s retries: 5核对连接凭证与配置
确认应用的数据库配置中,用户名、密码、数据库名称完全正确,且对应环境(如test)的配置文件已将连接地址更新为my-db。
内容的提问来源于stack exchange,提问作者joesan
相关产品推荐
相关产品推荐

