SpringBoot应用无法连接Docker部署的MySQL数据库问题排查
解决Docker部署SpringBoot无法连接MySQL的问题
核心问题定位
你遇到的通信失败问题,主要源于三个关键点:
- Docker内部服务通信的地址和端口配置错误
- SpringBoot启动时MySQL还未完全就绪
- MySQL用户权限限制了跨容器访问
具体修复步骤
1. 修正SpringBoot数据库连接配置
修改application.settings(或application.properties)的数据库连接参数:
spring.datasource.url=jdbc:mysql://db:3306/mydb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC spring.datasource.username=<your-user> spring.datasource.password=<your-pass> spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # 添加连接重试与超时配置,适配MySQL启动延迟 spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.maximum-pool-size=10 spring.datasource.hikari.connection-test-query=SELECT 1
- 关键注意:用Docker Compose服务名
db作为主机地址,端口使用容器内部的3306(而非宿主机映射端口);添加serverTimezone避免时区不匹配,allowPublicKeyRetrieval解决公钥验证报错。
2. 确保MySQL服务就绪后启动SpringBoot
depends_on仅保证容器启动顺序,不保证MySQL服务完全就绪,可通过两种方式处理:
- 方式一:SpringBoot内置重试配置
添加以下配置让应用在连接失败时自动重试:spring.datasource.hikari.initialization-fail-timeout=0 spring.jpa.hibernate.ddl-auto=update - 方式二:Docker Compose添加等待脚本
修改spring-api服务的启动命令,用wait-for-it脚本等待MySQL端口就绪:
需提前将spring-api: image: spring-api:latest ports: - "8080:8080" depends_on: - db command: ["./wait-for-it.sh", "db:3306", "--", "java", "-jar", "backendAPI.jar"]wait-for-it.sh脚本复制到SpringBoot容器中(修改Dockerfile添加COPY wait-for-it.sh /app/指令)。
3. 修正MySQL用户权限
容器内的SpringBoot应用不属于MySQL的localhost访问范围,需授权用户允许跨主机访问:
- 进入MySQL容器:
docker exec -it <db-container-name> mysql -uroot -p - 执行权限授予命令:
替换GRANT ALL PRIVILEGES ON mydb.* TO '<your-user>'@'%'; FLUSH PRIVILEGES;<your-user>为你配置的MySQL用户名。
4. 验证Docker Compose配置一致性
- 检查
docker-compose.yml中db服务的MYSQL_USER、MYSQL_PASSWORD与SpringBoot配置的用户名密码完全匹配 - 无需额外设置
container_name,Docker Compose默认用服务名db作为内部DNS解析地址
验证修复
重新构建SpringBoot镜像并启动容器:
docker-compose build spring-api docker-compose up
内容的提问来源于stack exchange,提问作者LoZTwilight
相关产品推荐
相关产品推荐

