Wildfly Docker容器连接PostgreSQL 5432端口被拒绝如何解决?
问题分析
从错误日志可以看到两个核心启动失败原因:
- 数据库连接被拒绝:Wildfly尝试连接
localhost:5432失败,容器内的localhost指向自身,而非PostgreSQL容器,导致无法访问数据库服务。 - WSDL服务访问失败:WAR包内硬编码了
http://localhost:9899/addr_searcher?wsdl地址,该服务未在Wildfly容器内启动或地址配置错误。
解决方案
1. 修复PostgreSQL数据源连接地址
修改standalone-full.xml中的数据源连接URL,使用Docker Compose的服务名访问数据库:
<datasource jndi-name="java:/PostgresDS" pool-name="PostgresDS" enabled="true"> <connection-url> jdbc:postgresql://database:5432/postgres </connection-url> <!-- 其他配置保持不变 --> </datasource>
- 原因:在同一Docker网络
resolute中,容器可通过服务名(database)直接通信,无需使用宿主机映射端口5433,PostgreSQL容器内部默认端口为5432。
2. 修正Dockerfile的WAR包部署路径
修改Dockerfile中WAR包的复制命令,直接将WAR包放到Wildfly的部署目录,避免手动复制操作:
# 替换原WAR包复制命令 ADD ./my-war-file.war /opt/jboss/wildfly/standalone/deployments/
3. 确保PostgreSQL完全就绪后启动Wildfly
在docker-compose.yml的database服务中添加健康检查,保证数据库启动完成后再启动Wildfly:
services: database: image: postgres:9.4 ports: - "5433:5432" environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=123456 - POSTGRES_DB=postgres networks: - resolute # 添加健康检查 healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5 wildfly: depends_on: # 依赖数据库的健康状态 database: condition: service_healthy # 其他配置保持不变
4. 修复WSDL服务地址问题
- 如果
addr_searcher是外部服务:修改WAR包内的配置,将localhost:9899替换为可访问的外部服务地址。 - 如果
addr_searcher是容器部署的服务:将其加入resolute网络,使用服务名替代localhost访问。
验证步骤
- 停止当前运行的容器:
docker-compose down - 重新构建并启动服务:
docker-compose up --build - 查看Wildfly日志,确认数据库连接正常且WAR包部署成功。
内容的提问来源于stack exchange,提问作者Nguyễn Nhật Trường
相关产品推荐
相关产品推荐

