Mysql + Docker + Spring Boot 连接问题(通讯链路故障)

问题描述 投票:0回答:4

我的项目是 Mysql、Spring Boot 和 Docker 的组合,但是当我尝试对其进行 dockerize 时,我遇到了错误。我搜索过但找不到任何解决方案。 这是我的 Dockerfile :

FROM maven:3.8.3-openjdk-17 AS build

WORKDIR /app
COPY target/TicketApp2-0.0.1-SNAPSHOT.jar /app
EXPOSE 8080

CMD ["java", "-jar", "TicketApp2-0.0.1-SNAPSHOT.jar"]

docker-compose.yml:

version: "3"
services:
  mysqldb:
    container_name: mysqldb
    image: mysql
    ports:
      - "3307:3306"
    environment:
      MYSQL_DATABASE: book
      MYSQL_ROOT_PASSWORD: 1234
      MYSQL_PASSWORD: 1234
    networks:
      common_network:
        aliases:
          - db


  springboot-app:
    container_name: spring-app
    image: springboot-app
    build: .
    ports:
      - "8080:8080"
    environment:
      MYSQL_HOST: mysqldb
      MYSQL_USER: root
      MYSQL_PASSWORD: 1234
      MYSQL_PORT: 3306    # we are in same network so we connect internally.
    depends_on:
      - mysqldb
    networks:
      - common_network

networks:
  common_network:
    driver: bridge

错误:

spring-app  | 2023-06-20 10:26:14.454  INFO 1 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
spring-app  | 2023-06-20 10:26:15.708 ERROR 1 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Exception during pool initialization.
spring-app  | 
spring-app  | com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
spring-app  | 
spring-app  | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
spring-app  |   at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
spring-app  |   at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
spring-app  |   at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:824) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
spring-app  |   at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:444) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
spring-app  |   at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:237) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
spring-app  |   at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
spring-app  |   at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-4.0.3.jar!/:na]
spring-app  |   at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) ~[HikariCP-4.0.3.jar!/:na]
spring-app  |   at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-4.0.3.jar!/:na]
spring-app  |   at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) ~[HikariCP-4.0.3.jar!/:na]
spring-app  |   at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[HikariCP-4.0.3.jar!/:na]
spring-app  |   at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) ~[HikariCP-4.0.3.jar!/:na]
spring-app  |   at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-4.0.3.jar!/:na]
spring-app  |   at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.6.5.Final.jar!/:5.6.5.Final]
spring-app  |   at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:181) ~[hibernate-core-5.6.5.Final.jar!/:5.6.5.Final]
spring-app  |   at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:68) ~[hibernate-core-5.6.5.Final.jar!/:5.6.5.Final]
spring-app  |   at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) ~[hibernate-core-5.6.5.Final.jar!/:5.6.5.Final]
spring-app  |   at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101) ~[hibernate-core-5.6.5.Final.jar!/:5.6.5.Final]
spring-app  |   at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-5.6.5.Final.jar!/:5.6.5.Final]
spring-app  |   at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:237) ~[hibernate-core-5.6.5.Final.jar!/:5.6.5.Final]
spring-app  |   at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.6.5.Final.jar!/:5.6.5.Final]
spring-app  |   at org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory.injectServices(DefaultIdentifierGeneratorFactory.java:175) ~[hibernate-core-5.6.5.Final.jar!/:5.6.5.Final]
spring-app  |   at org.hibernate.service.internal.AbstractServiceRegistryImpl.injectDependencies(AbstractServiceRegistryImpl.java:286) ~[hibernate-core-5.6.5.Final.jar!/:5.6.5.Final]
spring-app  |   at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:243) ~[hibernate-core-5.6.5.Final.jar!/:5.6.5.Final]
spring-app  |   at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:214) ~[hibernate-core-5.6.5.Final.jar!/:5.6.5.Final]
spring-app  |   at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.<init>(InFlightMetadataCollectorImpl.java:173) ~[hibernate-core-5.6.5.Final.jar!/:5.6.5.Final]
spring-app  |   at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:127) ~[hibernate-core-5.6.5.Final.jar!/:5.6.5.Final]
spring-app  |   at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1460) ~[hibernate-core-5.6.5.Final.jar!/:5.6.5.Final]
spring-app  |   at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1494) ~[hibernate-core-5.6.5.Final.jar!/:5.6.5.Final]
spring-app  |   at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.16.jar!/:5.3.16]
spring-app  |   at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.16.jar!/:5.3.16]
spring-app  |   at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-5.3.16.jar!/:5.3.16]
spring-app  |   at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-5.3.16.jar!/:5.3.16]
spring-app  |   at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.3.16.jar!/:5.3.16]
spring-app  |   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) ~[spring-beans-5.3.16.jar!/:5.3.16]
spring-app  |   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ~[spring-beans-5.3.16.jar!/:5.3.16]
spring-app  |   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.16.jar!/:5.3.16]
spring-app  |   at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.16.jar!/:5.3.16]
spring-app  |   at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.16.jar!/:5.3.16]
spring-app  |   at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.16.jar!/:5.3.16]
spring-app  |   at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.16.jar!/:5.3.16]
spring-app  |   at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.16.jar!/:5.3.16]
spring-app  |   at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154) ~[spring-context-5.3.16.jar!/:5.3.16]
spring-app  |   at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908) ~[spring-context-5.3.16.jar!/:5.3.16]
spring-app  |   at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.16.jar!/:5.3.16]
spring-app  |   at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.4.jar!/:2.6.4]
spring-app  |   at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:740) ~[spring-boot-2.6.4.jar!/:2.6.4]
spring-app  |   at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:415) ~[spring-boot-2.6.4.jar!/:2.6.4]
spring-app  |   at org.springframework.boot.SpringApplication.run(SpringApplication.java:303) ~[spring-boot-2.6.4.jar!/:2.6.4]
spring-app  |   at org.springframework.boot.SpringApplication.run(SpringApplication.java:1312) ~[spring-boot-2.6.4.jar!/:2.6.4]
spring-app  |   at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301) ~[spring-boot-2.6.4.jar!/:2.6.4]
spring-app  |   at com.yunus.ticketapp2.TicketApp2Application.main(TicketApp2Application.java:11) ~[classes!/:0.0.1-SNAPSHOT]
spring-app  |   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
spring-app  |   at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
spring-app  |   at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
spring-app  |   at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
spring-app  |   at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) ~[TicketApp2-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
spring-app  |   at org.springframework.boot.loader.Launcher.launch(Launcher.java:108) ~[TicketApp2-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
spring-app  |   at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) ~[TicketApp2-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
spring-app  |   at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88) ~[TicketApp2-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
spring-app  | Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure
spring-app  | 
spring-app  | The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
spring-app  |   at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
spring-app  |   at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) ~[na:na]
spring-app  |   at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na]
spring-app  |   at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[na:na]
spring-app  |   at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[na:na]
spring-app  |   at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
spring-app  |   at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
spring-app  |   at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
spring-app  |   at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
spring-app  |   at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:89) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
spring-app  |   at com.mysql.cj.NativeSession.connect(NativeSession.java:120) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
spring-app  |   at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:944) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
spring-app  |   at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:814) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
spring-app  |   ... 57 common frames omitted
spring-app  | Caused by: java.net.ConnectException: Connection refused
spring-app  |   at java.base/sun.nio.ch.Net.pollConnect(Native Method) ~[na:na]
spring-app  |   at java.base/sun.nio.ch.Net.pollConnectNow(Net.java:672) ~[na:na]
spring-app  |   at java.base/sun.nio.ch.NioSocketImpl.timedFinishConnect(NioSocketImpl.java:542) ~[na:na]
spring-app  |   at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:597) ~[na:na]
spring-app  |   at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) ~[na:na]
spring-app  |   at java.base/java.net.Socket.connect(Socket.java:633) ~[na:na]
spring-app  |   at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:153) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
spring-app  |   at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
spring-app  |   ... 60 common frames omitted

简单地说,我从 MySQL 数据库获取一些信息并将它们发送到我的本地网站。预先感谢您。

编辑:我可以通过 jdbc:mysql://localhost:3307/book 从外部使用 Spring Boot 应用程序访问 MySQL 容器。

mysql spring-boot docker maven docker-compose
4个回答
0
投票

该错误可能是由 docker-compose 中 MySQL 的一个常见问题引起的,即即使满足了

depends_on
的条件(检查容器是否已启动并运行,但尚未完成初始化)。

这个问题有多种解决方案。通常是某种形式的“等待”脚本或类似的脚本,用于对数据库执行 ping 操作,直到数据库准备就绪。请参阅此处讨论的一些选项:Docker-compose 检查 mysql 连接是否已准备好

编辑:此外,由于您的

mysqldb
服务定义不包含卷,因此每次重新启动容器时都会重新初始化数据库。您可以在
docker-compose.yml
中为 MySQL 数据定义一个卷,如下所示:

mysqldb:
...
    volumes:
      - /var/lib/mysql

0
投票

在 MySQL 容器的

ports
部分中,您提到了
3307:3306
。这意味着容器的端口 3306 将与主机的端口 3307 绑定。当您稍后将应用程序与此 MySQL 容器连接时,您将尝试连接到主机的端口 3306。您可以将其更改为3307并重试吗?


0
投票

这是我的应用程序。属性:

spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:${MYSQL_PORT:3306}/book
server.error.whitelabel.enabled=false
spring.datasource.username=${MYSQL_USER:root}
spring.datasource.password=${MYSQL_PASSWORD:1234}
spring.jpa.open-in-view=false
spring.thymeleaf.cache=false
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
spring.jpa.hibernate.ddl-auto=update
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

实际上这是正确的,但在更改之前我创建了 .jar 文件。因此,在 .jar 文件中,我有旧的 application.properties 信息。不要忘记更新您的 .jar 文件:)

编辑:顺便说一句,我在这里使用 3306,因为我的 Spring Boot 容器和 MySQL 容器位于同一网络中,因此它使用内部端口而不是 3307(外部端口)。最后一件事是使用 org.hibernate.dialect.MySQL8Dialect 而不是 MySQLDialect,具体取决于您的 MySQL 版本。例如,我有 8+


0
投票

由于我的愚蠢错误,我也遇到了同样的问题!我发现问题来自于 application.yml 中错误的数据库 URL 之前:“localhost:3306//”然后我将其更改为“mysqldb”,然后撰写(但没有删除以前的docker映像)=>我认为你应该删除它并撰写一个新的

© www.soinside.com 2019 - 2024. All rights reserved.