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

Docker-Compose下Spring Boot无法连接同网络MySQL求助

排查Docker Compose下Spring Boot无法连接MySQL容器的问题

我之前也踩过类似的容器通信坑,结合你描述的情况(docker run正常、docker-compose失败,MySQL外部可连接),咱们一步步拆解问题:

1. 最常见的坑:数据库连接URL错误

这是90%以上同类问题的根源!在Docker Compose的自定义网络中,容器不能用localhost或127.0.0.1访问同网络的其他容器,必须用服务名(也就是docker-compose.yml中MySQL服务的名称)作为主机地址。

检查你的application.yml,把数据库URL改成:

spring:
  datasource:
    url: jdbc:mysql://<mysql服务名>:3306/你的数据库名?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
    username: 你的数据库用户名
    password: 你的数据库密码

举个例子,如果docker-compose.yml里MySQL服务叫mysql,那URL就是:
jdbc:mysql://mysql:3306/mydb?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true

2. 核对Docker Compose配置细节

确保你的docker-compose.yml满足以下几点:

  • MySQL服务配置了必要的环境变量(初始化数据库、用户名密码)
  • 两个服务在同一默认网络(Docker Compose会自动创建,无需额外配置,除非你手动指定了多个网络)
  • 解决容器启动顺序问题(Spring Boot可能比MySQL先启动,导致连接失败)

参考正确的docker-compose.yml模板:

version: '3.8'
services:
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root123
      MYSQL_DATABASE: mydb
      MYSQL_USER: app_user
      MYSQL_PASSWORD: app_pass
    # 不需要暴露3306端口给宿主机(外部连接用),同一网络内部通信不需要
    # ports:
    #   - "3306:3306"
    healthcheck:
      # 检测MySQL是否就绪
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot123"]
      interval: 5s
      timeout: 5s
      retries: 5

  spring-boot-app:
    build: .
    depends_on:
      mysql:
        # 等待MySQL健康检查通过再启动应用
        condition: service_healthy
    restart: on-failure
    environment:
      # 指定加载Docker环境的配置(如果你的application.yml分了profile)
      SPRING_PROFILES_ACTIVE: docker

3. 检查Spring Boot的连接重试配置

即使加了健康检查,也可以在应用层配置连接重试,避免偶发的连接失败:

spring:
  datasource:
    hikari:
      connection-timeout: 20000
      maximum-pool-size: 5
      validation-timeout: 5000
      connection-test-query: SELECT 1
  # 开启Spring重试机制
  retry:
    enabled: true

4. 验证容器间网络连通性

如果以上配置都没问题,可以手动测试通信:

  1. 启动docker-compose后,进入Spring Boot容器:
    docker exec -it <你的Spring Boot容器名称> /bin/bash
    
  2. 尝试ping MySQL服务名:
    ping mysql
    

如果ping不通,说明两个容器不在同一网络,检查docker-compose.yml是否给服务指定了不同的自定义网络。

5. 排查镜像构建问题(spotify dockerfile-maven-plugin)

确保构建的镜像包含正确的配置:

  • 检查Dockerfile是否正确复制了application.yml(或者确保jar包已经打包了正确的配置):
    FROM openjdk:17-jdk-slim
    WORKDIR /app
    COPY target/your-app.jar app.jar
    # 如果需要单独覆盖配置,加上这行
    # COPY src/main/resources/application-docker.yml application.yml
    EXPOSE 8080
    ENTRYPOINT ["java", "-jar", "app.jar"]
    
  • 构建时指定正确的Spring Profile(如果用了多环境配置):
    mvn dockerfile:build -Dspring.profiles.active=docker
    

内容的提问来源于stack exchange,提问作者Mr.Rajeh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:09:10