无法使用 Docker 将 Java 程序连接到 MySQL
Can't connect Java program to MySQL using Docker
我正在学习 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)
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 中本地 运行 时,整个配置 运行 正确。
因为您没有提供完整的堆栈信息,这将显示 tomcat 正在使用什么连接字符串,我不得不猜测您没有为您的 tomcat conainer 提供正确的连接字符串.您必须提供一个连接字符串,例如:
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可以缓存构建层。对于旧的 Order,您的 war
是图像的第一层,并且每次您对应用程序进行更改时都会更改,从而导致每次都重建后续层,即使它们没有更改。新订单更好地使用 docker chache。使用此顺序,永不更改的 MySQL 驱动程序始终被缓存,并且配置也不会像 war.
那样快速更改。
在此示例中,效果可能很小,但如果您构建具有更多层和冗长构建步骤的更大图像(如 apt-get install smth
),chache 可以显着加快构建速度。
我正在学习 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)
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 中本地 运行 时,整个配置 运行 正确。
因为您没有提供完整的堆栈信息,这将显示 tomcat 正在使用什么连接字符串,我不得不猜测您没有为您的 tomcat conainer 提供正确的连接字符串.您必须提供一个连接字符串,例如:
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可以缓存构建层。对于旧的 Order,您的 war
是图像的第一层,并且每次您对应用程序进行更改时都会更改,从而导致每次都重建后续层,即使它们没有更改。新订单更好地使用 docker chache。使用此顺序,永不更改的 MySQL 驱动程序始终被缓存,并且配置也不会像 war.
在此示例中,效果可能很小,但如果您构建具有更多层和冗长构建步骤的更大图像(如 apt-get install smth
),chache 可以显着加快构建速度。