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

Docker Compose连接Spring REST API与MySQL容器失败排查

React-Spring-MySQL应用MySQL连接拒绝问题排查

我参考网络资料、GitHub仓库及各类教程,尝试搭建基于React-Spring-MySQL架构的应用,但MySQL容器始终拒绝连接,无法定位问题原因。

现有配置文件

application.properties配置

spring.datasource.url=jdbc:mysql://${DB_HOSTNAME}:${DB_PORT}/${DB_DATABASE}?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}
spring.jpa.hibernate.ddl-auto = create-drop

spring.datasource.max-wait=20000
spring.datasource.max-active=50
spring.datasource.max-idle=20
spring.datasource.min-idle=15
spring.datasource.max_allowed_packet=33554432

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-request-size=50MB
spring.servlet.multipart.max-file-size=50MB

Spring项目Dockerfile

FROM maven:3.9-eclipse-temurin-17-alpine as build

WORKDIR /app

COPY pom.xml ./

COPY src src/

RUN mvn clean install -Dmaven.test.skip=true

# Run the app in a minimal java container

FROM eclipse-temurin:17-jre-alpine

VOLUME /tmp

EXPOSE 8080

ARG JAR_FILE=/app/target/*.jar

COPY --from=build ${JAR_FILE} app.jar

ENTRYPOINT ["java","-jar","/app.jar"]

docker-compose配置

services:
  airclone_mysql:
    image: mysql:8.2
    container_name: airclone_mysql
    restart: always
    ports:
      - 3307:3306
    environment:
      - MYSQL_ROOT_PASSWORD=airclone1
      - MYSQL_USER=airclone
      - MYSQL_PASSWORD=airclone1
      - MYSQL_DATABASE=airclone
    volumes:
      - type: volume
        source: mysql-data
        target: /var/lib/mysql
    networks:
      - localnet

  airclone_backend:
    depends_on:
      - airclone_mysql
    container_name: airclone_backend
    build:
      context: ./backend
      dockerfile: Dockerfile
    environment:
      - DB_HOSTNAME=airclone_mysql
      - DB_PORT=3307
      - DB_USERNAME=airclone
      - DB_PASSWORD=airclone1
      - DB_DATABASE=airclone
    ports:
      - "8080:8080"
    networks:
      - localnet

  airclone_frontend:
    depends_on:
      - airclone_backend
    container_name: airclone_frontend
    build:
      context: ./frontend
      dockerfile: Dockerfile
    ports:
      - "5173:5173"
    networks:
      - localnet

volumes:
  mysql-data:

networks:
  localnet:
    driver: bridge

容器报错日志片段

2023-12-12 16:50:55 Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure
2023-12-12 16:50:55 The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
2023-12-12 16:50:55     at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
2023-12-12 16:50:55     at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) ~[na:na]
2023-12-12 16:50:55     at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) ~[na:na]
2023-12-12 16:50:55     at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Unknown Source) ~[na:na]
2023-12-12 16:50:55     at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source) ~[na:na]
2023-12-12 16:50:55     at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) ~[mysql-connector-j-8.1.0.jar!/:8.1.0]
2023-12-12 16:50:55     at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) ~[mysql-connector-j-8.1.0.jar!/:8.1.0]
2023-12-12 16:50:55     at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) ~[mysql-connector-j-8.1.0.jar!/:8.1.0]
2023-12-12 16:50:55     at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) ~[mysql-connector-j-8.1.0.jar!/:8.1.0]
2023-12-12 16:50:55     at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) ~[mysql-connector-j-8.1.0.jar!/:8.1.0]
2023-12-12 16:50:55     at com.mysql.cj.NativeSession.connect(NativeSession.java:121) ~[mysql-connector-j-8.1.0.jar!/:8.1.0]
2023-12-12 16:50:55     at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:833) ~[mysql-connector-j-8.1.0.jar!/:8.1.0]
2023-12-12 16:50:55     ... 156 common frames omitted
2023-12-12 16:50:55 Caused by: java.net.ConnectException: Connection refused
2023-12-12 16:50:55     at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
2023-12-12 16:50:55     at java.base/sun.nio.ch.Net.pollConnectNow(Unknown Source) ~[na:na]
2023-12-12 16:50:55     at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(Unknown Source) ~[na:na]
2023-12-12 16:50:55     at java.base/sun.nio.ch.NioSocketImpl.connect(Unknown Source) ~[na:na]
2023-12-12 16:50:55     at java.base/java.net.SocksSocketImpl.connect(Unknown Source) ~[na:na]
2023-12-12 16:50:55     at java.base/java.net.Socket.connect(Unknown Source) ~[na:na]
2023-12-12 16:50:55     at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) ~[mysql-connector-j-8.1.0.jar!/:8.1.0]
2023-12-12 16:50:55     at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) ~[mysql-connector-j-8.1.0.jar!/:8.1.0]
2023-12-12 16:50:55     ... 158 common frames omitted

问题排查与修复方案

1. 数据库端口配置错误

容器之间通信时,应该使用MySQL容器内部的端口3306,而不是映射到宿主机的3307端口。修改docker-compose中airclone_backend的环境变量:

environment:
  - DB_HOSTNAME=airclone_mysql
  - DB_PORT=3306  # 替换原来的3307
  - DB_USERNAME=airclone
  - DB_PASSWORD=airclone1
  - DB_DATABASE=airclone

2. depends_on不保证数据库就绪

depends_on仅保证容器启动顺序,不代表MySQL已经完成初始化并可以接受连接。需要给MySQL添加健康检查,并让后端依赖其健康状态:

修改MySQL服务配置

airclone_mysql:
  # 原有配置不变
  healthcheck:
    test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "airclone", "-pairclone1"]
    interval: 10s
    timeout: 5s
    retries: 5

修改后端服务的依赖配置

airclone_backend:
  depends_on:
    airclone_mysql:
      condition: service_healthy  # 等待MySQL健康检查通过后再启动
  # 原有配置不变

3. 清理application.properties冗余配置

文件中重复定义了spring.jpa.hibernate.ddl-auto,删除其中一行spring.jpa.hibernate.ddl-auto = create-drop,保留spring.jpa.hibernate.ddl-auto=update即可。

可选:添加Spring连接重试配置

在application.properties中添加Hikari连接池的重试配置,增强容错能力:

spring.datasource.hikari.connection-timeout=20000
spring.datasource.hikari.maximum-pool-size=50
spring.datasource.hikari.minimum-idle=15
spring.datasource.hikari.initialization-fail-timeout=0  # 无限等待直到连接成功

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:40:59