You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的情况,按以下顺序排查:

  1. 验证端口映射配置
    检查Docker Compose中Spring Boot服务的ports字段是否正确,比如容器内应用监听9090端口,则需配置:

    ports:
      - "9090:9090"
    

    如果应用默认用8080端口,需改成9090:8080,避免端口映射不匹配。

  2. 确认Spring Boot监听地址
    容器内应用必须绑定0.0.0.0而非localhost,否则仅容器内部可访问。在application.properties或application.yml中添加:

    server.address=0.0.0.0
    

    或启动时添加参数--server.address=0.0.0.0。

  3. 容器内本地测试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路径是否正确、服务是否完全启动。
  4. 检查防火墙与端口占用

    • 宿主机上用netstat -tulpn | grep 9090(Linux)或netstat -ano | findstr :9090(Windows)检查9090端口是否被其他进程占用。
    • 确认宿主机防火墙未拦截9090端口,Linux可临时关闭防火墙测试:ufw disable,Windows可在防火墙设置中添加端口允许规则。
  5. 验证Docker网络配置
    如果使用了自定义网络,确认Spring Boot容器和宿主机在同一网络环境中,或尝试直接用容器IP访问:

    docker inspect <spring-boot-container-name> | grep "IPAddress"
    

    然后用http://<container-ip>:9090/api/测试,若仍无法访问,回到步骤3确认应用自身状态。

内容的提问来源于stack exchange,提问作者coder87

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 23:31:13