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

Docker中运行MySQL与Spring Boot应用后出现通信链路故障

问题描述

我尝试在Docker中运行Spring Boot应用与MySQL。MySQL数据库启动正常,Spring应用部署到容器后却出现如下错误:

Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure

以下是我的docker-compose.yaml文件内容:

version: "3.8"

services:
  mysql-db:
    image: mysql
    container_name: mysqldb
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: employeedb
      MYSQL_HOST: mysql-db
      MYSQL_PORT: 3306
    networks:
      - mt-network

networks:
  mt-network:
    driver: bridge

以及application-properties.yml文件内容:

spring:
 datasource:
  password: root
  url: jdbc:mysql://mysql-db:3306/employeedb
  username: root
  driver-class-name: com.mysql.cj.jdbc.Driver
 jpa:
  hibernate:
   ddl-auto: update

我已尝试各种方法修复,但问题仍存在。请勿将此问题标记为重复问题。

解决方案
  • 清理MySQL容器无效环境变量:docker-compose.yaml中给MySQL容器设置的MYSQL_HOST和MYSQL_PORT并非官方镜像的有效配置项,MySQL容器内部默认监听0.0.0.0:3306,删除这两个变量即可。
  • 将Spring Boot服务加入同一Docker网络:当前配置仅让MySQL服务接入mt-network,需在docker-compose.yaml中添加Spring Boot服务配置并指定同一网络,示例:
services:
  mysql-db:
    # 保留原MySQL配置
    ...
  spring-app:
    build: .  # 假设项目根目录存在Dockerfile
    container_name: spring-boot-app
    depends_on:
      - mysql-db
    networks:
      - mt-network
    ports:
      - "8080:8080"
  • 添加MySQL服务健康检查与启动依赖:depends_on仅保证容器启动顺序,不确保数据库服务就绪。给MySQL服务添加健康检查,并让Spring Boot服务等待MySQL就绪后启动:
    更新MySQL服务配置:
mysql-db:
  ...
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-proot"]
    interval: 5s
    timeout: 5s
    retries: 5

更新Spring Boot服务的依赖配置:

spring-app:
  ...
  depends_on:
    mysql-db:
      condition: service_healthy
  • 验证MySQL驱动与镜像版本兼容性:若使用MySQL 8.x镜像,当前application-properties.yml中配置的com.mysql.cj.jdbc.Driver是正确的8.x版本驱动;若驱动版本过低,需在项目依赖文件(pom.xml或build.gradle)中更新驱动至兼容版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 07:07:14