2016-07-30 34 views
4

Ich lerne Docker und versuche, meine Java-Webanwendung mit Tomcat Container zu setzen. Ich folgte ein paar grundlegende Tutorials, aber ich fand keine Lösung, um richtig zu mir zu arbeiten. Wenn ich meine Datenbank und Java-Container laufen bekomme ich den Fehler:Ich kann kein Java-Programm mit MySQL über Docker verbinden

SEVERE: Unable to create initial connections of pool. 
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 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 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:404) 
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:981) 
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:339) 
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2253) 
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2286) 
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2085) 
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:795) 
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:44) 

MySQL Dockerfile

FROM mysql:latest 
ENV MYSQL_DATABASE=db_name #name of db that is required by Java program 

Geführt von:

docker run --name db_name -e MYSQL_ROOT_PASSWORD=root -d db_name 

Java Dockerfile

FROM tomcat:7.0.70-jre8 
ADD deploy /usr/local/tomcat/webapps #extracted .war 
ADD jdbc /usr/local/tomcat/lib #MySQL jdbc drivers 
ADD context /usr/local/tomcat/conf #context.xml 

Geführt von :

docker run --name app_name --link db_name:db_name -p 8080:8080 -d app_name 

Die gesamte Konfiguration wurde ordnungsgemäß ausgeführt, wenn ich es lokal in Eclipse ausgeführt habe.

+0

Was ist mysql_hostname oder mysql Verbindungszeichenfolge in Java-Konfigurationsdatei? –

+0

Es gab "url =" jdbc: mysql: // localhost: 3306/db_name ". Ich änderte zu" jdbc: mysql: // db_name: 3306/db_name "wie @Ohmen beraten und es funktioniert jetzt richtig. – Marcon

Antwort

2

Da Sie nicht die vollständige Stack-Tace bereitstellen, die zeigen würde, welche Verbindungszeichenfolge Tomcat verwendet, muss ich raten, dass Sie Ihrem Tomcat-Conainer nicht die richtige Verbindungszeichenfolge bereitstellen. Sie müssen eine Verbindungszeichenfolge wie zum Beispiel:

jdbc:mysql://database_container_name:3306/database_name 

in Ihre Tomcat-Konfiguration eingeben.


BTW:

Sie sollten Sie Zeilen in der Tomcat Dockerfile neu ordnen zu

FROM tomcat:7.0.70-jre8 
ADD jdbc /usr/local/tomcat/lib #MySQL jdbc drivers 
ADD context /usr/local/tomcat/conf #context.xml 
ADD deploy /usr/local/tomcat/webapps #extracted .war 

Da Docker cachen Schichten aufbauen können. Bei der alten Reihenfolge ist Ihre war die erste Ebene des Bildes und ändert sich jedes Mal, wenn Sie eine Änderung an Ihrer Anwendung vornehmen, was dazu führt, dass die nachfolgenden Ebenen jedes Mal neu erstellt werden, auch wenn sie sich nicht ändern. Der neue Auftrag verwendet den Docker-Chach besser. Bei dieser Reihenfolge wird der sich nie ändernde MySQL-Treiber immer zwischengespeichert und die Konfiguration ändert sich auch nicht so schnell wie der Krieg.

In diesem Beispiel ist der Effekt möglicherweise minimal, aber wenn Sie größere Bilder mit mehr Layern und längeren Build-Schritten erstellen (wie apt-get install smth), kann der Chache Ihren Build erheblich beschleunigen.

+0

Es funktioniert. Danke für die Antwort und deinen Rat;) – Marcon

+0

Gern geschehen – Ohmen