Spring Boot容器无法连接MySQL容器的问题排查求助
Spring Boot容器化后无法连接MySQL容器的排查与解决
核心排查与修复步骤
1. 确保MySQL服务完全就绪
depends_on仅保证容器启动顺序,不代表MySQL服务已初始化完成。可以给Spring Boot应用加连接重试机制,或在启动脚本中等待MySQL就绪:
- 在
application.properties中添加连接池配置:
spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.validation-timeout=5000 spring.datasource.hikari.connection-test-query=SELECT 1
- 在docker-compose的Spring Boot服务中添加启动等待命令(需确保容器内有
netcat,可在Dockerfile中通过RUN apt-get update && apt-get install -y netcat安装):
command: sh -c "while ! nc -z mysql-server 3306; do sleep 1; done; java -jar app.jar"
2. 验证网络连通性
- 检查两个容器是否在同一网络:
docker inspect <spring-boot容器名> | grep Networks docker inspect mysql-server | grep Networks
- 进入Spring Boot容器,测试MySQL容器的可访问性:
docker exec -it <spring-boot容器名> ping mysql-server docker exec -it <spring-boot容器名> nc -zv mysql-server 3306
如果ping不通,确认网络配置;如果nc连接失败,检查MySQL是否绑定了0.0.0.0而非127.0.0.1,可在docker-compose中添加:
mysql-server: command: --bind-address=0.0.0.0
3. 核对数据库连接参数
- 确认
SPRING_DATASOURCE_URL格式正确(MySQL 8.0需加时区等参数):
jdbc:mysql://mysql-server:3306/你的数据库名?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
- 检查用户名、密码是否与MySQL容器初始化的一致,可进入MySQL容器验证权限:
SELECT user, host FROM mysql.user; GRANT ALL PRIVILEGES ON 你的数据库名.* TO '你的用户名'@'%'; FLUSH PRIVILEGES;
4. 从错误日志定位问题
- 若日志显示
Connection refused:优先排查网络连通性、MySQL服务是否就绪 - 若日志显示
Access denied:检查用户名/密码正确性、数据库权限配置 - 确认日志中实际使用的连接URL是否与配置一致(避免环境变量未覆盖application.properties的情况)
示例docker-compose.yml配置
version: '3.8' services: mysql-server: image: mysql:8.0 container_name: mysql-server command: --bind-address=0.0.0.0 --default-authentication-plugin=mysql_native_password environment: MYSQL_ROOT_PASSWORD: root123 MYSQL_DATABASE: demo_db MYSQL_USER: demo_user MYSQL_PASSWORD: demo123 volumes: - mysql-data:/var/lib/mysql spring-boot-app: build: . container_name: spring-boot-app environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql-server:3306/demo_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true SPRING_DATASOURCE_USERNAME: demo_user SPRING_DATASOURCE_PASSWORD: demo123 ports: - "8080:8080" depends_on: - mysql-server command: sh -c "while ! nc -z mysql-server 3306; do sleep 2; done; java -jar /app.jar" networks: - app-network volumes: mysql-data: networks: app-network: driver: bridge
内容的提问来源于stack exchange,提问作者noor.soreti
相关产品推荐
相关产品推荐

