[英]Can't connect to mySql docker container with JDBC
当测试集成开始时,我可以使用以下命令在终端的容器上连接到mysql:
mysql -h 127.0.0.1 -P 32795 -uroot -p
一切都很好,但是当我想使用以下代码将Java应用程序中的mysql与JDBC连接时:
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");
但什么都没有改变。
<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容器中设置的MySQL配置文件( my.cnf
)使用:
bind-address = 0.0.0.0
就像这个答案中所解释的(相反的情况:从docker容器连接到在主机上运行的mysql,但是这里的想法是一样的),在桥接模式下,将bind-address
设置为broadcast模式将有助于验证mysql是可访问的。
注意:如果使用
bind-address = 0.0.0.0
MySQL服务器将侦听所有网络接口上的连接。 这意味着您可以从Internet访问MySQL服务器。 确保相应地设置防火墙规则。
完成此测试后,检查“ 如何从主机连接到在容器中运行的mysql ”
默认情况下,root仅具有从本地主机127.0.0.1&:: 1的访问权限,您需要专门允许从192.168.99.1或用户设置中使用“%”的任何位置进行访问。
请参阅“ 保护初始MySQL帐户 ”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.