Java 从docker容器连接到主机mysql db时连接被拒绝

Java 从docker容器连接到主机mysql db时连接被拒绝,java,mysql,spring,docker,docker-networking,Java,Mysql,Spring,Docker,Docker Networking,我正在尝试从docker容器中运行的spring应用程序连接到主机(localhost)上运行的mysql服务器 这是我的文件 FROM openjdk:11 ADD build/libs/demo-0.0.1-SNAPSHOT.jar demo.jar EXPOSE 8000 RUN mkdir -p tmp/scripts RUN mkdir -p tmp/logs ENTRYPOINT ["java","-jar","/demo.jar"] 我正在使用Docker desktop for

我正在尝试从docker容器中运行的spring应用程序连接到主机(localhost)上运行的mysql服务器

这是我的文件

FROM openjdk:11
ADD build/libs/demo-0.0.1-SNAPSHOT.jar demo.jar
EXPOSE 8000
RUN mkdir -p tmp/scripts
RUN mkdir -p tmp/logs
ENTRYPOINT ["java","-jar","/demo.jar"]
我正在使用Docker desktop for mac v2.3.0.3和引擎版本19.03.8

这可能是hikariCP数据源连接属性

spring.datasource.jdbcUrl=jdbc:mysql://**host.docker.internal:3306**/freshid
spring.datasource.username=sa
spring.datasource.password=test
当我构建
docker build-f Dockerfile-t demo.
并以
docker run-p 8000:8000 demo运行映像时

我在应用程序启动时遇到以下错误

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:835)
    at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:455)
    at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
    at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:199)
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
    at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:354)
    at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202)
    at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:473)
    at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:554)
    ... 64 common frames omitted
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151)
    at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167)
    at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:91)
    at com.mysql.cj.NativeSession.connect(NativeSession.java:152)
    at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:955)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:825)
    ... 72 common frames omitted
Caused by: java.net.ConnectException: Connection refused (Connection refused)
    at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
    at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
    at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403)
    at java.base/java.net.Socket.connect(Socket.java:609)
    at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155)
    at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65)
    ... 75 common frames omitted
成功发送到服务器的最后一个数据包是0毫秒前的。驱动程序尚未从服务器收到任何数据包。
位于com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)
位于com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)
位于com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:835)
位于com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:455)
位于com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
位于com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:199)
在com.zaxxer.hikari.util.DriverDataSource.getConnection上(DriverDataSource.java:138)
位于com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:354)
在com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:202)上
在com.zaxxer.hikari.pool.HikariPool.createPoolEntry上(HikariPool.java:473)
在com.zaxxer.hikari.pool.HikariPool.checkFailFast上(HikariPool.java:554)
... 省略64个公共帧
原因:com.mysql.cj.exceptions.CJCommunicationsException:通信链路故障
成功发送到服务器的最后一个数据包是0毫秒前的。驱动程序尚未从服务器收到任何数据包。
位于java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
位于java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
在com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)上
在com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)上
在com.mysql.cj.exceptions.ExceptionFactory.createException上(ExceptionFactory.java:151)
位于com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167)
在com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:91)上
位于com.mysql.cj.NativeSession.connect(NativeSession.java:152)
位于com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:955)
位于com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:825)
... 省略72个公共帧
原因:java.net.ConnectException:连接被拒绝(连接被拒绝)
位于java.base/java.net.PlainSocketImpl.socketConnect(本机方法)
位于java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
位于java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
位于java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
位于java.base/java.net.socksocketimpl.connect(socksocketimpl.java:403)
位于java.base/java.net.Socket.connect(Socket.java:609)
位于com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155)
在com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:65)上
... 省略75个公共框架

我建议一个简单的解决方案

步骤1:Turboshooting:尝试在您的机器中,在容器外部运行springboot应用程序。如果工作正常,那么您的应用程序就没有问题。(确保在本地测试时,将数据库连接字符串从
host.docker.internal
更改为
localhost

第二步:使用imperiive命令运行Docker容器时,请公开您的DB端口,对于mysql,默认为
3306

docker-run-p8000:8000-p3306:3306演示版


这将解决您的问题我建议一个简单的解决方案

步骤1:Turboshooting:尝试在您的机器中,在容器外部运行springboot应用程序。如果工作正常,那么您的应用程序就没有问题。(确保在本地测试时,将数据库连接字符串从
host.docker.internal
更改为
localhost

第二步:使用imperiive命令运行Docker容器时,请公开您的DB端口,对于mysql,默认为
3306

docker-run-p8000:8000-p3306:3306演示版


这应该可以解决您的问题我卸载并重新安装了docker(19.03.8),它正常工作。最后一个连接字符串是
jdbc:mysql://host.docker.internal:3306/db
。这并不意味着任何技术上的正确性,但它确实起了作用。谢谢。

我卸载并重新安装了docker(19.03.8),它工作正常。最后一个连接字符串是
jdbc:mysql://host.docker.internal:3306/db
。这并不意味着任何技术上的正确性,但它确实起了作用。谢谢。

jdbc:mysql://host.docker.internal:3306/db -这是我的连接字符串请注意,特殊的主机名
host.docker.internal
长期以来一直是一项仅在macOS版本的docker上有效的功能。确保您没有使用旧版本的Docker,并且您使用的操作系统实际上支持此功能。Windows:表示:“这是为了开发目的,在Docker Desktop for Windows之外的生产环境中不起作用。”如前所述,我使用Docker Desktop for MAC v2.3.0.3,引擎版本为19.03.8。您是否也配置了