Spring Boot无法连接到同一网络的docker中的mysql

Posted

技术标签:

【中文标题】Spring Boot无法连接到同一网络的docker中的mysql【英文标题】:Spring boot can't connect to mysql in docker for the same network 【发布时间】:2022-01-11 16:31:52 【问题描述】:

运行mysql镜像[mysql最新版本]Not duplicate of this problem:

 docker run -d --name=docker-mysql --env="MYSQL_ROOT_PASSWORD=test123" --env="MYSQL_USER=user1"  --env="MYSQL_PASSWORD=test123" --env="MYSQL_DATABASE=dockertest" -p 3306:3306 mysql

运行 Spring Boot 应用映像:

docker run -t -p 8080:8080 --link docker-mysql:mysql docker-userapp

注意:

    当我使用这些凭据在本地环境中使用 mysql 运行 spring boot 时,项目运行正常 我在上面运行的 MySQL 容器工作正常,因为我可以登录到容器化的 MySQL 服务器并手动运行命令。

看来,MySQL 容器没问题,但不知何故,spring boot 无法访问数据库。我是码头工人的新手。请建议我需要更改什么?

spring application.properties 文件:

spring.jpa.hibernate.ddl-auto=update
server.servlet.contextPath=/docker-api
spring.datasource.url=jdbc:mysql://localhost:3306/dockertest
spring.datasource.username=user1
spring.datasource.password=test123

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL8Dialect
spring.jpa.properties.hibernate.dialect.storage_engine=innodb
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.id.new_generator_mappings=true
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.show-sql=true

错误日志:

2021-12-06 12:46:18.386 信息 1 --- [主要] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - 开始... 2021-12-06 12:46:18.389 警告 1 --- [主要] com.zaxxer.hikari.util.DriverDataSource :注册驱动程序 driverClassName=com.mysql.jdbc.Driver 没找到,直接试试 实例化。 2021-12-06 12:46:19.505 错误 1 ​​--- [主要] com.zaxxer.hikari.pool.HikariPool:HikariPool-1 - 异常 在池初始化期间。

com.mysql.cj.jdbc.exceptions.CommunicationsException:通信 链接失败

最后一个成功发送到服务器的数据包是 0 毫秒 前。驱动程序没有收到来自服务器的任何数据包。在 com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-java-8.0.27.jar!/:8.0.27] 在 com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) ~[mysql-connector-java-8.0.27.jar!/:8.0.27] 在 com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828) ~[mysql-connector-java-8.0.27.jar!/:8.0.27] 在 com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:448) ~[mysql-connector-java-8.0.27.jar!/:8.0.27] 在 com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) ~[mysql-connector-java-8.0.27.jar!/:8.0.27] 在 com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) ~[mysql-connector-java-8.0.27.jar!/:8.0.27] 在 com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-4.0.3.jar!/:na] 在 com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) ~[HikariCP-4.0.3.jar!/:na] 在 com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-4.0.3.jar!/:na] 在 com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) [HikariCP-4.0.3.jar!/:na] 在 com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) [HikariCP-4.0.3.jar!/:na] 在 com.zaxxer.hikari.pool.HikariPool.(HikariPool.java:115) [HikariCP-4.0.3.jar!/:na] 在 com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) [HikariCP-4.0.3.jar!/:na] 在 org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) [hibernate-core-5.6.1.Final.jar!/:5.6.1.Final] 在 org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:181) [hibernate-core-5.6.1.Final.jar!/:5.6.1.Final] 在 org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:68) [hibernate-core-5.6.1.Final.jar!/:5.6.1.Final] 在 org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) [hibernate-core-5.6.1.Final.jar!/:5.6.1.Final]

【问题讨论】:

这个问题和docker有很大关系,我建议在标题中加上“docker”。 看看这是否有帮助***.com/a/53276117/5193536 Mysql 和你的应用在同一个网络对吗?您还可以使用 docker 名称访问 mysql,例如“spring.datasource.url=jdbc:mysql://mysql:3306/dockertest”如果您在 docker compose 中将 mysql 定义为“mysql” @Gurkanİlleez,是的,他们在同一个网络上,感谢您的建议。会试试的 【参考方案1】:

该错误意味着您没有将驱动程序依赖项作为在 docker 上运行的 APP.jar 的库的一部分。

首先,查看您的/target/app.jar,解压缩此 jar 并查看它是否为 FAT jar,这意味着它具有所有必需的依赖项。

看看你能不能在那里找到罐子mysql-connector-java,这就是你所缺少的。

马文:

https://mvnrepository.com/artifact/mysql/mysql-connector-java

【讨论】:

我可以把那个罐子放在/BOOT-INF/lib/ 路径中。

以上是关于Spring Boot无法连接到同一网络的docker中的mysql的主要内容,如果未能解决你的问题,请参考以下文章

如何将主机上运行的 Spring Boot 应用程序连接到 Docker 上运行的 Postgresql?

无法从Spring Boot Docker容器连接到本地MySQL数据库服务器

通过 Spring Boot 应用程序连接到 Docker Compose MongoDb

Spring Boot + MySQL + Docker Compose - 无法使 Spring Boot 连接到 MySQL

无法使用 Spring Boot 应用程序连接到 Docker 映像

无法将mysql连接到spring boot项目