无法使用Docker将Java程序连接到MySQL

我正在学习docker,并尝试使用Tomcat将我的Java Web应用程序放到容器中。 我跟着一些基本的教程,但我发现没有解决scheme正常工作给我。 如果我运行我的数据库和Java容器,我得到的错误:

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 

由……运营:

 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 

由……运营:

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

当我在Eclipse中本地运行它时,整个configuration正常运行。

因为你不提供完整的堆栈tace,它会显示tomcat正在使用的连接string,所以我不得不猜测你没有提供正确的连接string给你的tomcat conainer。 你必须提供一个连接string,如:

 jdbc:mysql://database_container_name:3306/database_name 

进入你的tomcatconfiguration。


BTW:

你应该重新排列你在Tomcat Dockerfile中的行

 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 

因为docker可以caching构build层。 对于旧的Order,您的war是图像的第一层,每当您对应用程序进行更改时都会发生变化,导致每次重build图层,即使这些图层没有更改。 新的订单使用docker更好。 有了这个命令,永远不会改变的MySQL驱动程序总是被caching,configuration也不会像战争那样快速改变。

在这个例子中,这个效果可能是最小的,但是如果你用更多的图层和更长的构build步骤构build更大的图像(比如apt-get install smth ),chache可以显着加快构build速度。