Docker Compose部署:Spring Boot容器连PostgreSQL及API访问问题
问题排查思路:Spring Boot + Docker Compose 部署问题
一、PostgreSQL连接被拒绝问题复盘(已解决,供后续参考)
虽然你已经解决了连接问题,但可以确认几个核心点是否是问题根源:
- 网络与数据源配置:确保Spring Boot的
spring.datasource.url中使用Docker Compose里PostgreSQL服务的名称作为主机名,而非localhost。比如compose中PostgreSQL服务名为db,则URL应为jdbc:postgresql://db:5432/your_db——因为Docker Compose默认创建的专属网络中,服务名可直接解析为容器IP。 - PostgreSQL就绪检测:如果之前用了等待命令仍无效,建议在compose的PostgreSQL服务中添加健康检查,让Spring Boot仅在PostgreSQL完全就绪后启动:
services: db: image: postgres:latest healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 5s timeout: 5s retries: 5 app: build: . depends_on: db: condition: service_healthy - PostgreSQL远程访问权限:容器启动时默认允许所有IP连接,但需确认是否设置了正确的
POSTGRES_USER、POSTGRES_PASSWORD环境变量,避免因认证失败导致连接被拒绝。
二、API无法访问问题排查步骤
针对当前无法通过localhost:9090/api/访问API的情况,按以下顺序排查:
验证端口映射配置
检查Docker Compose中Spring Boot服务的ports字段是否正确,比如容器内应用监听9090端口,则需配置:ports: - "9090:9090"如果应用默认用8080端口,需改成
9090:8080,避免端口映射不匹配。确认Spring Boot监听地址
容器内应用必须绑定0.0.0.0而非localhost,否则仅容器内部可访问。在application.properties或application.yml中添加:server.address=0.0.0.0或启动时添加参数
--server.address=0.0.0.0。容器内本地测试API
进入Spring Boot容器,直接测试服务是否正常:docker exec -it <spring-boot-container-name> curl localhost:9090/api/- 如果容器内可以访问:问题出在宿主机到容器的网络映射,检查宿主机防火墙是否开放9090端口,或尝试用宿主机IP(而非localhost)访问,比如
http://192.168.x.x:9090/api/。 - 如果容器内也无法访问:说明应用本身有问题,检查Spring Boot日志中是否有Tomcat启动成功的日志(如
Tomcat started on port(s): 9090 (http)),确认API路径是否正确、服务是否完全启动。
- 如果容器内可以访问:问题出在宿主机到容器的网络映射,检查宿主机防火墙是否开放9090端口,或尝试用宿主机IP(而非localhost)访问,比如
检查防火墙与端口占用
- 宿主机上用
netstat -tulpn | grep 9090(Linux)或netstat -ano | findstr :9090(Windows)检查9090端口是否被其他进程占用。 - 确认宿主机防火墙未拦截9090端口,Linux可临时关闭防火墙测试:
ufw disable,Windows可在防火墙设置中添加端口允许规则。
- 宿主机上用
验证Docker网络配置
如果使用了自定义网络,确认Spring Boot容器和宿主机在同一网络环境中,或尝试直接用容器IP访问:docker inspect <spring-boot-container-name> | grep "IPAddress"然后用
http://<container-ip>:9090/api/测试,若仍无法访问,回到步骤3确认应用自身状态。
内容的提问来源于stack exchange,提问作者coder87
相关产品推荐
相关产品推荐

