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

Docker Compose部署Spring Boot+MySQL应用失败求助

解决Docker中Spring Boot与MySQL容器通信异常问题

核心问题:容器间网络寻址错误

你的应用容器配置里,数据库URL用了localhost:3306——但在Docker容器内部,localhost指向的是应用容器自身,而非MySQL容器。Docker Compose会自动为所有服务创建共享网络,直接用服务名(这里是db)就能访问对应容器的服务。

第一步:修正数据库连接地址

把docker-compose.yml里的SPRING_DATASOURCE_URL改成以下内容:

SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/crm?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
  • allowPublicKeyRetrieval=true:解决MySQL 8.0+版本的公钥检索权限问题
  • serverTimezone=UTC:避免时区不匹配导致的连接超时或报错

验证用户与密码配置

你提到MySQL Workbench使用的用户是bestuser,但当前配置文件里用的是bestuser123,请确认:

  • docker-compose.yml中MYSQL_USER与应用配置的SPRING_DATASOURCE_USERNAME完全一致
  • 如果打算用root用户连接,需将SPRING_DATASOURCE_USERNAME改为root,密码对应MYSQL_ROOT_PASSWORD的值

其他优化建议

  1. 修正Hibernate方言:MySQL 8.0不再兼容MySQL5Dialect,需改为对应版本的方言,可在环境变量中直接配置:
SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT: org.hibernate.dialect.MySQL8Dialect
  1. 确保MySQL服务就绪后再启动应用:depends_on仅保证容器启动顺序,不确保MySQL服务完全可用。添加健康检查来解决这个问题:
    在docker-compose.yml的db服务中加入健康检查配置:
healthcheck:
  test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"]
  interval: 5s
  timeout: 5s
  retries: 5

同时修改app-server的depends_on配置:

depends_on:
  db:
    condition: service_healthy
  1. 统一配置优先级:Docker Compose的环境变量会覆盖application.properties中的配置,确保两者的用户名、密码、数据库名完全一致。

修正后的完整docker-compose.yml示例

version: '3.7'

services:
  app-server:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8081:8080"
    restart: always
    depends_on:
      db:
        condition: service_healthy
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/crm?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
      SPRING_DATASOURCE_USERNAME: bestuser123
      SPRING_DATASOURCE_PASSWORD: bestuser123
      SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT: org.hibernate.dialect.MySQL8Dialect

  db:
    image: mysql:8.0
    ports:
      - "3307:3306"
    restart: always
    environment:
      MYSQL_DATABASE: crm
      MYSQL_USER: bestuser123
      MYSQL_PASSWORD: bestuser123
      MYSQL_ROOT_PASSWORD: bestuser123
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD}"]
      interval: 5s
      timeout: 5s
      retries: 5

内容的提问来源于stack exchange,提问作者user20432214

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:20:22