java - java不能用JDBC连接到 mySql Docker 容器

  显示原文与译文双语对照的内容

我使用了 Docker Maven 插件。

测试集成启动后,我可以使用以下命令在终端上的容器上连接 mysql:


mysql -h 127.0.0.1 -P 32795 -uroot -p



我想在java应用程序中使用这个代码连接 mysql,但一切都很好:


Class.forName("com.mysql.jdbc.Driver").newInstance();


Connection connection = DriverManager.getConnection(


"jdbc:mysql://127.0.0.1:" + System.getProperty("mysqlPort") +"/dashboardmanager",


"root",


"root"


);



我得到一个错误:


org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Cannot create PoolableConnectionFactory (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 org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]


 at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:615) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]


 at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:866) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]


 at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:927) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]


 at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:937) ~[spring-jdbc-4.2.4.RELEASE.jar:4.2.4.RELEASE]



我试过:


export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"




System.setProperty("java.net.preferIPv4Stack","true");



但没有改变。

Docker Maven 插件插件:


<plugin>


 <groupId>org.jolokia</groupId>


 <artifactId>docker-maven-plugin</artifactId>


 <version>${docker-maven-plugin.version}</version>


 <configuration>


 <images>


 <image>


 <name>mysql:5.7.11</name>


 <run>


 <env>


 <MYSQL_ROOT_PASSWORD>root</MYSQL_ROOT_PASSWORD>


 <MYSQL_DATABASE>dashboardmanager</MYSQL_DATABASE>


 </env>


 <ports>


 <port>mysqlPort:3306</port>


 </ports>


 </run>


 </image>


 </images>


 </configuration>


 <executions>


 <execution>


 <id>start</id>


 <phase>pre-integration-test</phase>


 <goals>


 <goal>start</goal>


 </goals>


 </execution>


 <execution>


 <id>stop</id>


 <phase>post-integration-test</phase>


 <goals>


 <goal>stop</goal>


 </goals>


 </execution>


 </executions>


 </plugin>



时间: 原作者:

问题是:

mySql启动过程占用了 40秒,所以我应该保持约 40秒,然后尝试连接 mySql,这样简单:

或者我可以在 pom.xml 中使用这些设置:


<image>


 <name>mysql:5.7.11</name>


 <alias>mysqlContainer</alias>


 <run>


 <env>


 <MYSQL_ROOT_PASSWORD>root</MYSQL_ROOT_PASSWORD>


 <MYSQL_DATABASE>dashboard</MYSQL_DATABASE>


 </env>


 <ports>


 <port>mysqlPort:3306</port>


 </ports>


 <wait>


 <log>.*port: 3306 MySQL Community Server.*</log>


 <time>120000</time>


 </wait>


 </run>


</image>



原作者:

确保你的MySQL配置文件( my.cnf ) 设置在你的MySQL容器中使用:


bind-address = 0.0.0.0



就像中解释的,这个答案是 ( 对于反向情况: 从 Docker 容器中连接到 mysql,但是这里的思想是相同的,在桥模式下设置 bind-address 将帮助验证 mysql 。

注意:如果使用 bind-address = 0.0.0.0,MySQL服务器将监听所有网络接口上的连接。 这意味着可以从互联网访问MySQL服务器;确保相应地设置防火墙规则。

在这里测试之后,检查"如何连接到运行在主机from的容器中的mysql"

默认情况下,root 只有从localhost访问 127.0.0.1 &:: 1,你需要特别允许从 192.168.99.1 或者用户安装使用'%'。
查看"保护初始的MySQL账户。"。

原作者:
...