Docker中Spring应用连接外部映射端口MySQL报连接拒绝如何解决
问题根因
两个问题导致连接失败:
- 最核心的是Docker网络通信逻辑理解错误:docker-compose中配置的
"3307:3306"端口映射,作用是把宿主机的3307端口转发到MySQL容器的3306端口,仅对宿主机上的进程生效——你用宿主机上的phpMyAdmin能正常连接,就是走的这个映射规则。但你的Spring应用本身运行在my-backend容器内,和MySQL容器同属Compose自动创建的内部私有网络,容器之间直接通过服务名做DNS解析通信,不需要走宿主机端口映射。你配置里写的localhost对于Spring容器来说指向的是容器自身,容器本身没有监听3307端口,自然会报连接拒绝。 - YAML语法错误:你的数据源配置中
url:和后面的JDBC连接串之间没有留空格,会导致配置项无法被Spring正确解析。
修复步骤
- 修改
application.yml中的数据源配置,将数据库主机地址改为Compose中定义的MySQL服务名db,端口使用MySQL容器内部的默认服务端口3306,同时修正YAML语法空格问题,修改后配置如下:
spring: datasource: url: jdbc:mysql://db:3306/my_db?serverTimezone=UTC&enabledTLSProtocols=TLSv1.2 username: root password: root
- 重新构建启动后端容器即可正常连通。
注意:现有配置里的
depends_on仅能控制容器启动顺序,无法保证MySQL服务完全初始化完成,如果偶发启动时连接失败,可以给Spring数据源配置加上连接重试参数,或者增加等待MySQL服务就绪的启动脚本,不影响本次核心问题修复。
内容的提问来源于stack exchange,提问作者Piotror
相关产品推荐
相关产品推荐

