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
相关产品推荐
相关产品推荐

