使用docker compose连接Spring API REST容器和MySQL容器

busg9geu  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(136)

使用一些来自互联网的指导,github的仓库,教程和诸如此类的东西,我试图使用react-spring-mysql堆栈运行一个应用程序。从我对mysql容器的理解来看,它拒绝了连接,但我不知道为什么。
这是我的application.properties:

  1. spring.datasource.url=jdbc:mysql://${DB_HOSTNAME}:${DB_PORT}/${DB_DATABASE}?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false
  2. spring.datasource.username=${DB_USERNAME}
  3. spring.datasource.password=${DB_PASSWORD}
  4. spring.jpa.hibernate.ddl-auto = create-drop
  5. spring.datasource.max-wait=20000
  6. spring.datasource.max-active=50
  7. spring.datasource.max-idle=20
  8. spring.datasource.min-idle=15
  9. spring.datasource.max_allowed_packet=33554432
  10. spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
  11. spring.jpa.hibernate.ddl-auto=update
  12. spring.jpa.show-sql=true
  13. spring.jpa.properties.hibernate.format_sql=true
  14. spring.servlet.multipart.enabled=true
  15. spring.servlet.multipart.max-request-size=50MB
  16. spring.servlet.multipart.max-file-size=50MB

字符串
这是spring项目根目录中的Dockerfile:

  1. FROM maven:3.9-eclipse-temurin-17-alpine as build
  2. WORKDIR /app
  3. COPY pom.xml ./
  4. COPY src src/
  5. RUN mvn clean install -Dmaven.test.skip=true
  6. # Run the app in a minimal java container
  7. FROM eclipse-temurin:17-jre-alpine
  8. VOLUME /tmp
  9. EXPOSE 8080
  10. ARG JAR_FILE=/app/target/*.jar
  11. COPY --from=build ${JAR_FILE} app.jar
  12. ENTRYPOINT ["java","-jar","/app.jar"]


这是我的docker-compose:

  1. services:
  2. airclone_mysql:
  3. image: mysql:8.2
  4. container_name: airclone_mysql
  5. restart: always
  6. ports:
  7. - 3307:3306
  8. environment:
  9. - MYSQL_ROOT_PASSWORD=airclone1
  10. - MYSQL_USER=airclone
  11. - MYSQL_PASSWORD=airclone1
  12. - MYSQL_DATABASE=airclone
  13. volumes:
  14. - type: volume
  15. source: mysql-data
  16. target: /var/lib/mysql
  17. networks:
  18. - localnet
  19. airclone_backend:
  20. depends_on:
  21. - airclone_mysql
  22. container_name: airclone_backend
  23. build:
  24. context: ./backend
  25. dockerfile: Dockerfile
  26. environment:
  27. - DB_HOSTNAME=airclone_mysql
  28. - DB_PORT=3307
  29. - DB_USERNAME=airclone
  30. - DB_PASSWORD=airclone1
  31. - DB_DATABASE=airclone
  32. ports:
  33. - "8080:8080"
  34. networks:
  35. - localnet
  36. airclone_frontend:
  37. depends_on:
  38. - airclone_backend
  39. container_name: airclone_frontend
  40. build:
  41. context: ./frontend
  42. dockerfile: Dockerfile
  43. ports:
  44. - "5173:5173"
  45. networks:
  46. - localnet
  47. volumes:
  48. mysql-data:
  49. networks:
  50. localnet:
  51. driver: bridge


我错过了什么?
容器日志中错误的最后一部分说:

  1. 2023-12-12 16:50:55 Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure
  2. 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.
  3. 2023-12-12 16:50:55 at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
  4. 2023-12-12 16:50:55 at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) ~[na:na]
  5. 2023-12-12 16:50:55 at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) ~[na:na]
  6. 2023-12-12 16:50:55 at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Unknown Source) ~[na:na]
  7. 2023-12-12 16:50:55 at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source) ~[na:na]
  8. 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]
  9. 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]
  10. 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]
  11. 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]
  12. 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]
  13. 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]
  14. 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]
  15. 2023-12-12 16:50:55 ... 156 common frames omitted
  16. 2023-12-12 16:50:55 Caused by: java.net.ConnectException: Connection refused
  17. 2023-12-12 16:50:55 at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
  18. 2023-12-12 16:50:55 at java.base/sun.nio.ch.Net.pollConnectNow(Unknown Source) ~[na:na]
  19. 2023-12-12 16:50:55 at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(Unknown Source) ~[na:na]
  20. 2023-12-12 16:50:55 at java.base/sun.nio.ch.NioSocketImpl.connect(Unknown Source) ~[na:na]
  21. 2023-12-12 16:50:55 at java.base/java.net.SocksSocketImpl.connect(Unknown Source) ~[na:na]
  22. 2023-12-12 16:50:55 at java.base/java.net.Socket.connect(Unknown Source) ~[na:na]
  23. 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]
  24. 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]
  25. 2023-12-12 16:50:55 ... 158 common frames omitted

bpsygsoo

bpsygsoo1#

在Docker Compose中确保后端在MySQL之后启动

看起来你的后端服务器可能试图在MySQL服务完全启动和运行之前启动。为了解决这个问题并确保你的后端只在MySQL准备好之后才启动,你可以在Docker Compose文件中利用healthcheck指令。
下面是一个示例Docker Compose文件,演示了如何对MySQL使用健康检查,并确保后端服务仅在MySQL健康时启动:

  1. version: '3'
  2. services:
  3. mysql:
  4. image: mysql:latest
  5. container_name: mysql_container
  6. environment:
  7. MYSQL_ROOT_PASSWORD: your_root_password
  8. MYSQL_DATABASE: your_database
  9. MYSQL_USER: your_user
  10. MYSQL_PASSWORD: your_password
  11. ports:
  12. - "3306:3306"
  13. healthcheck:
  14. test: mysqladmin ping -h 127.0.0.1 -u $$MYSQL_USER --password=$$MYSQL_PASSWORD
  15. interval: 10s
  16. timeout: 5s
  17. retries: 3
  18. backend:
  19. image: your_backend_image
  20. container_name: backend_container
  21. depends_on:
  22. mysql:
  23. condition: service_healthy
  24. ports:
  25. - "8080:8080"

字符串
在此配置中:

  • healthcheck指令用于MySQL服务。它定期检查MySQL服务器是否响应。
  • backend服务有一个depends_on指令,指定它依赖于mysql服务。这确保了在MySQL服务健康之前,后端服务不会启动。

根据特定的MySQL配置调整MySQL服务的environment部分中的值。
通过合并这些健康检查,您可以缓解与MySQL服务准备就绪之前启动后端相关的问题,确保更可靠的设置。
我希望这对你有帮助!如果你有进一步的问题或遇到任何问题,请随时询问。

展开查看全部

相关问题