Cannot connect to docker mySql container with JDBC

I am using Docker Maven Plugin

When testing integration begins, I can connect to mysql on the container in the terminal using this command:

mysql -h 127.0.0.1 -P 32795 -uroot -p 

and everything works fine, but when I want to connect mysql in a java application with JDBC using this code:

 Class.forName("com.mysql.jdbc.Driver").newInstance(); Connection connection = DriverManager.getConnection( "jdbc:mysql://127.0.0.1:" + System.getProperty("mysqlPort") + "/dashboardmanager", "root", "root" ); 

I get this error:

 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] 

I tried:

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

and

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

but nothing has changed.

Docker Maven Plugin Conf:

 <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> 
+5
source share
2 answers

The problem was this:

The process of starting MySql takes about 40 seconds, so I have to stay about 40 seconds and after that try to connect to mySql, it's so simple :)

Or I can use these settings in 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> 
+4
source

Make sure your MySQL configuration file ( my.cnf ) installed in the mysql container uses:

 bind-address = 0.0.0.0 

As explained in this answer (for the opposite case: connecting to mysql running on the host from the docker container, but the idea is here) in the mode bridge, setting bind-address to broadcast mode would help verify that mysql is available.

Note. If you use bind-address = 0.0.0.0 , your MySQL server will listen for connections on all network interfaces. This means that your MySQL server can be accessed from the Internet; Be sure to configure the firewall rules.

After this test, check the box How to connect to mysql running in the container from the host machine "

By default, root only has access with localhost, 127.0.0.1 and :: 1, you need to specifically allow access from 192.168.99.1 or from anywhere, using the "%" in your user settings.
See " Securing MySQL Source Accounts .

0
source

Source: https://habr.com/ru/post/1243192/


All Articles