Docker Compose部署Spring Boot连接MySQL失败求助
排查Docker Compose下Spring Boot无法连接MySQL的方案
1. 确认容器网络通信配置
- Spring Boot配置文件中,数据库主机名必须使用Docker Compose中MySQL服务的服务名(比如
mysql),不能用localhost或127.0.0.1——容器在同一自定义网络内通过服务名寻址,localhost指向容器自身,而非MySQL容器。 - 测试连通性:执行
docker exec -it <你的Spring Boot容器名> ping mysql,如果ping不通,检查docker-compose.yml是否为所有服务配置了同一网络(默认会创建一个默认网络,但若手动指定了网络需确保都在里面)。
2. 等待MySQL初始化完成再启动Spring Boot
MySQL容器启动后需要时间完成初始化(创建数据库、用户等),Spring Boot启动过快会导致连接失败:
- 在docker-compose.yml中为Spring Boot服务添加健康检查依赖:
services: spring-boot-app: # 其他配置 depends_on: mysql: condition: service_healthy mysql: # 其他配置 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"] interval: 5s timeout: 5s retries: 5 - 或在Spring Boot配置中添加连接重试机制:
spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.maximum-pool-size=10 spring.datasource.hikari.connection-test-query=SELECT 1
3. 核对数据库配置参数一致性
- 确保Spring Boot配置中的数据库名、用户名、密码与docker-compose.yml中MySQL的环境变量完全匹配:
- MySQL环境变量示例:
mysql: environment: MYSQL_DATABASE: mydb MYSQL_USER: appuser MYSQL_PASSWORD: apppass MYSQL_ROOT_PASSWORD: rootpass - Spring Boot对应配置:
spring.datasource.url=jdbc:mysql://mysql:3306/mydb?serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true spring.datasource.username=appuser spring.datasource.password=apppass
- MySQL环境变量示例:
- 注意:容器间通信使用MySQL容器内部端口(默认3306),无需使用主机映射的端口(比如33060)。
4. 验证JDBC驱动与MySQL版本兼容性
- MySQL 8.x版本需使用
mysql-connector-java:8.0.x驱动,且URL需添加serverTimezone参数;5.x版本用5.1.x驱动,无需该参数。 - 若使用Spring Boot Starter,确保
spring-boot-starter-data-jpa或spring-boot-starter-jdbc自动引入的驱动版本与MySQL匹配,也可手动指定:<!-- Maven示例 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency>
5. 查看容器日志定位具体错误
- 查看MySQL容器日志,确认初始化是否正常:
docker logs <你的MySQL容器名>,检查是否有“Access denied”“database not found”等错误。 - 查看Spring Boot容器日志,获取更详细的连接报错:
docker logs <你的Spring Boot容器名>,比如是否是SSL配置问题、权限不足,还是DNS解析失败。
内容的提问来源于stack exchange,提问作者amangupta
相关产品推荐
相关产品推荐

