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地址改成:
因为Angular和Spring服务都加入了export const environment = { production: true, apiBaseUrl: 'http://springpart:8077' };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
相关产品推荐
相关产品推荐

