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