You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 22:06:26