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

Docker Compose下Spring Boot、Angular与MySQL通信故障求助

解决Docker Compose下Angular无法调用Spring Boot API的问题

我看你遇到的情况很典型:Docker Compose启动后,直接浏览器访问Spring API没问题,但Angular客户端发起请求就报ERR_CONNECTION_REFUSED。结合你的配置文件,我帮你拆解几个核心问题和解决步骤:

1. 最关键:Angular的API请求地址配置错误

这是90%概率导致这个问题的原因:

  • 你在浏览器里用localhost:8077能访问API,是因为localhost指向你的宿主机;但Angular是运行在Docker容器里的,它的localhost指的是容器自己,不是宿主机。
  • 解决方法:修改Angular生产环境的API base URL,用Docker Compose的服务名来访问Spring Boot。比如在environment.prod.ts里把API地址改成:
    export const environment = {
      production: true,
      apiBaseUrl: 'http://springpart:8077'
    };
    
    因为Angular和Spring服务都加入了frontend网络,Docker会自动把服务名springpart解析成对应的容器IP,这样容器内部就能正常通信了。

2. 数据库相关问题排查

关于mbind: Operation not permitted日志

这个是MySQL 8.0在Linux容器里的常见警告,完全不影响功能——是因为容器没有权限使用内存绑定系统调用,直接忽略就行,你能访问部分API也印证了这一点。

关于DDL外键创建错误

本地正常但Docker里报错,大概率是MySQL大小写敏感的问题:

  • 本地Windows/macOS的MySQL默认不区分表名大小写,但Docker里的MySQL默认是区分的。如果你的SQL脚本里表名大小写不一致(比如user和User),就会导致外键找不到表。
  • 解决方法:给db服务添加环境变量,强制表名不区分大小写:
    db:
      image: mysql:8.0
      environment:
        - MYSQL_ROOT_PASSWORD=mypassword
        - MYSQL_DATABASE=guitarshop
        - MYSQL_INITDB_SKIP_TZINFO=1
        - LOWER_CASE_TABLE_NAMES=1  # 新增这个
      volumes:
        - .src/main/resources/guitarshop/currentGuitarshopData:/docker-entrypoint-initdb.d
      networks:
        - backend
    
  • 另外检查你的application.properties里的数据库URL有语法错误:?serverTimezone=UTC&useLegacyDatetimeCode=false?autoReconnect=true里有两个?,第二个应该改成&,正确的URL是:
    spring.datasource.url=jdbc:mysql://db:3306/guitarshop?serverTimezone=UTC&useLegacyDatetimeCode=false&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
    

等待MySQL完全就绪再启动Spring

depends_on只是保证容器启动顺序,不保证MySQL服务完全就绪。可以给db加健康检查,让Spring等MySQL真正可用再启动:

db:
  image: mysql:8.0
  # ... 其他配置
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-pmypassword"]
    timeout: 20s
    retries: 10

springpart:
  # ... 其他配置
  depends_on:
    db:
      condition: service_healthy  # 改成等待健康检查通过

3. Docker Compose配置小修正

  • 你的springpart服务里DATABASE_PORT环境变量写错了,应该是3306(容器内部端口),不是3306:3306(宿主机映射端口):
    springpart:
      environment:
        - DATABASE_HOST=db
        - DATABASE_PORT=3306  # 修改这里
    

总结

优先解决Angular的API地址问题,这是直接导致请求拒绝的原因。如果数据库DDL错误还存在,再调整MySQL大小写配置和等待逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 07:02:34