Jetty Docker容器运行的spring应用程序无法连接到在docker容器外运行的mysql

我是docker世界的新手。 我有docker运行的容器,运行一个spring的应用程序,无法连接到docker集装箱外运行的MySQL。 Mysql运行在我的本地主机上,这是一个MAC。 我知道docker运行在Mac上的虚拟机。 我的jdbc连接string是jdbc.url=jdbc:mysql://127.0.0.1:3306/

下面是我看到的例外

 nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database! at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) ... 71 more Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database! at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:394) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:443) at com.multi.enterprise.commons.jdbc.config.JdbcConfig.jdbcTemplate(JdbcConfig.java:57) at com.multi.enterprise.commons.jdbc.config.JdbcConfig.namedParameterJdbcTemplate(JdbcConfig.java:52) at com.multi.enterprise.commons.jdbc.config.JdbcConfig$$EnhancerBySpringCGLIB$$492af47.CGLIB$namedParameterJdbcTemplate$3(<generated>) at com.multi.enterprise.commons.jdbc.config.JdbcConfig$$EnhancerBySpringCGLIB$$492af47$$FastClassBySpringCGLIB$$1a9e6a23.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:358) at com.multi.enterprise.commons.jdbc.config.JdbcConfig$$EnhancerBySpringCGLIB$$492af47.namedParameterJdbcTemplate(<generated>) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ... 72 more Caused by: java.sql.SQLException: Connections could not be acquired from the underlying database! at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106) at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:529) at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111) at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77) ... 86 more Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source. at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319) at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557) at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477) at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525) ... 89 more 

由于docker容器有自己的networking名称空间,因此它有自己的127.0.0.1。 您将不得不通过另一个可路由的IP地址连接到您的主机。

在我的情况下,我的Mac是在我的本地家庭networking上的一个IP地址:192.168.10.42。 当我运行Docker for Mac应用程序时,它启动了一个小型虚拟机。 在那个虚拟机里面,docker工和我的所有容器一起运行。 正在运行的虚拟机默认将所有stream量发送出虚拟机。 由于我的mac可以访问192.168.10.42地址,所以我从虚拟机内部发送给这个ip的任何stream量都会到达我的mac。

从我运行的其中一个容器的angular度来看,它发出的任何stream量都是由虚拟机处理的。 这意味着虚拟机可以到达的任何位置也可以从我的容器中获得。

如果你不想取决于你的Mac的IP地址是在你的本地networking上,你可以这样做: https : //gist.github.com/ralphschindler/535dc5916ccbd06f53c1b0ee5a868c93

这个想法是给你的Mac地址,无论你将你的Mac移动到哪个networking,它都将始终如一。 我做了一个类似的事情,在那里我将通过系统偏好networkinggui添加一个新的网桥接口到我的mac。 我只留下没有物理接口的网桥,然后我手动分配一个IP地址给它。

这两种方法都可以工作,因为记住,Mac上的任何ip地址都可以从Docker for Mac运行的vm中路由到。

Docker 17.06的全新可能性是使用docker.for.mac.localhost地址,而不是使用前面提到的任何其他解决方法。 (目前的稳定版本仍然是17.03。)

请参阅: https : //github.com/docker/docker.github.io/pull/3220了解17.06