Spring Boot+Docker Compose连接MySQL遇Connection refused问题求助
Docker Compose下Spring Boot连接MySQL出现Connection refused的解决方法
核心问题分析
- 容器环境里的
localhost指的是容器自身,而非宿主机或MySQL容器,Spring Boot用localhost:3306根本找不到MySQL服务 depends_on只保证容器启动顺序,不确保MySQL完成初始化就能接受连接- MySQL 5.7搭配MySQL8Dialect存在版本不匹配问题,可能引发额外连接异常
具体修改方案
1. 修正application.properties的数据库配置
把连接地址里的localhost替换为Docker Compose中MySQL的服务名mysqldb,同时调整方言、添加连接重试和超时配置:
spring.datasource.url=jdbc:mysql://mysqldb:3306/db_example?useSSL=false&allowPublicKeyRetrieval=true&connectTimeout=10000&socketTimeout=30000 spring.datasource.username=root spring.datasource.password=mypass # 适配MySQL 5.7的Hibernate方言 spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect # 连接池优化,提升稳定性 spring.datasource.hikari.maximum-pool-size=5 spring.datasource.hikari.connection-timeout=20000
2. 调整docker-compose.yml配置
- 移除MySQL容器的
hostname: localhost,Docker Compose会自动用服务名作为容器主机名 - 添加健康检查,确保MySQL完全就绪后再启动Spring Boot
- 可选:映射MySQL端口方便本地调试
version: "3" services: springboot-app: build: context: . dockerfile: Dockerfile ports: - "8080:8080" depends_on: mysqldb: condition: service_healthy # 等待MySQL健康检查通过才启动应用 environment: - SPRING_DATASOURCE_URL=jdbc:mysql://mysqldb:3306/db_example?useSSL=false&allowPublicKeyRetrieval=true - SPRING_DATASOURCE_USERNAME=root - SPRING_DATASOURCE_PASSWORD=mypass - SPRING_JPA_HIBERNATE_DDL_AUTO=update - SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT=org.hibernate.dialect.MySQL57Dialect mysqldb: platform: linux/x86_64 image: mysql:5.7 ports: - "3306:3306" # 可选,本地可直接连接调试 environment: MYSQL_DATABASE: db_example MYSQL_ROOT_PASSWORD: mypass healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"] interval: 5s timeout: 5s retries: 5
3. 优化Dockerfile(可选)
用多阶段构建减小镜像体积,提升构建效率:
# 构建阶段:编译打包应用 FROM maven:3.6.3-openjdk-11-slim AS builder WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline # 提前下载依赖,避免重复下载 COPY src ./src RUN mvn clean package -DskipTests # 运行阶段:只保留运行所需的JRE和打包好的jar FROM openjdk:11-jre-slim WORKDIR /app COPY --from=builder /app/target/app.jar . CMD ["java", "-jar", "app.jar"]
验证操作
- 清理旧容器和数据卷:
docker-compose down -v - 重新构建并启动服务:
docker-compose up --build - 查看应用日志确认连接状态:
docker-compose logs -f springboot-app
内容的提问来源于stack exchange,提问作者Sergei Krainyukov
相关产品推荐
相关产品推荐

