2016-02-17 5 views
4

Я использую Docker Maven PluginНе удается подключиться к MySql Docker контейнер с JDBC

Когда тест-интеграция начинается я могу подключиться к MySQL на контейнере в терминале с помощью этой команды:

mysql -h 127.0.0.1 -P 32795 -uroot -p 

и Everythings работает хорошо, но когда я хочу подключить MySQL в Java приложения с помощью 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"); 

, но ничего не изменилось.

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> 
+0

Выполняете ли вы тесты * в * контейнере вашего докера или хотите подключить * к * контейнеру mysql (извне)? – jah

+0

Я хочу подключиться к mysql снаружи – Arman

+0

Вам нужно выяснить IP вашего контейнера. Скорее всего, вам нужно использовать * docker-machine ip YOUR_ENV *, чтобы узнать, что ip. – jah

ответ

4

Проблема заключалась в следующем:

процесс запуска 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> 
+0

Хорошо заметили, и хорошая обратная связь, более точная, чем мой ответ. +1 – VonC

0

Убедитесь, что ваш ваш конфигурационный файлом MySQL (my.cnf), установленный в вашем тузд контейнере использует:

bind-address = 0.0.0.0 

Как объяснен в this answer (для обратного случая: подключение к mysql работает на хосте из контейнера docker, но идея здесь же), в режиме моста установка bind-address в широковещательный режим помогла бы проверить, что mysql является доступным.

Note: if you use bind-address = 0.0.0.0 your MySQL server will listen for connections on all network interfaces. That means your MySQL server could be reached from the Internet ; make sure to setup firewall rules accordingly.

После этого испытания, проверить "How to connect to mysql running in container from host machine"

By default, root only has access from the localhost, 127.0.0.1 & ::1, you need to specifically allow access from 192.168.99.1 or from anywhere using '%' in the user setup.
See " Securing the Initial MySQL Accounts ".

+0

Я использую [MYSQL] (https://hub.docker.com/r/library/mysql/), используется ли это 'bind-address = 0.0.0.0'? Если проблема в ip-адресе, почему я могу подключиться к терминалу с машиной 'mysql -h 127.0.0.1 -P 32795 -uroot -p'? – Arman

+0

@Arman Проверьте свой '/ etc/mysql/my.cnf' в своем контейнере. – VonC

+0

bind-address не установлен. 'my.cnf' is' # bind-address \t = 127.0.0.1' , но я не думаю, что проблема в том, что я могу подключиться к терминалу хост-машины с помощью mysql -h 127.0.0.1 -P 32795 -uroot -p', как сказано ранее – Arman

Смежные вопросы