Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t使用Docker将Java程序连接到MySQL_Java_Mysql_Tomcat_Docker_Tomcat7 - Fatal编程技术网

Can';t使用Docker将Java程序连接到MySQL

Can';t使用Docker将Java程序连接到MySQL,java,mysql,tomcat,docker,tomcat7,Java,Mysql,Tomcat,Docker,Tomcat7,我正在学习docker,并尝试使用Tomcat将我的Java web应用程序放到容器中。我遵循了一些基本的教程,但我没有找到适合我的解决方案。如果运行数据库和java容器,则会出现以下错误: SEVERE: Unable to create initial connections of pool. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packe

我正在学习docker,并尝试使用Tomcat将我的Java web应用程序放到容器中。我遵循了一些基本的教程,但我没有找到适合我的解决方案。如果运行数据库和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)
运行人:

docker run --name db_name -e MYSQL_ROOT_PASSWORD=root -d db_name
docker run --name app_name --link db_name:db_name -p 8080:8080 -d app_name
Java Dockerfile

FROM mysql:latest
ENV MYSQL_DATABASE=db_name #name of db that is required by Java program
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 db_name -e MYSQL_ROOT_PASSWORD=root -d db_name
docker run --name app_name --link db_name:db_name -p 8080:8080 -d app_name

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

因为您没有提供完整的堆栈tace,这将显示tomcat正在使用的连接字符串,我不得不猜测您没有为tomcat容器提供正确的连接字符串。您必须提供一个连接字符串,如:

jdbc:mysql://database_container_name:3306/database_name
进入您的tomcat配置


顺便说一句:

您应该将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可以缓存构建层。按照旧的顺序,您的
war
是图像的第一层,并且每次更改应用程序时都会发生更改,从而导致每次都要重新生成富利层,即使它们没有更改。新订单更好地使用了docker chache。按照这个顺序,永远不会改变的MySQL驱动程序总是被缓存,配置也不会像war那样改变


在本例中,效果可能很小,但如果您使用更多的层和冗长的构建步骤(如
apt get install smth
)构建更大的映像,则该更改可以显著加快构建速度。

java配置文件中的mysql\u主机名或mysql连接字符串是什么?有“url=”jdbc:mysql://localhost:3306/db_name,我改为“jdbc:mysql://db_name:3306/db_name“就像@Ohmen advise,它现在可以正常工作了。