无法使用 docker 中的 jdbc 连接到 mysql
Unable to connect to mysql using jdbc in docker
我有以下 docker-撰写:
version: '3.1'
services:
db:
container_name: db
image: mysql
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=world
volumes:
- ./mysql-db/:/docker-entrypoint-initdb.d
networks:
- my-network
app:
depends_on:
- db
container_name: app
build: App/
networks:
- my-network
networks:
my-network:
driver: bridge
这将构建 mysql
图像并使用本地文件创建数据库。我可以通过主机上的数据库客户端连接到数据库。 我知道数据库是 运行 并在端口 3306.
上使用这些凭据
App/Dockerfile
:
# Build stage
FROM maven:latest AS build
COPY src /app/src
COPY pom.xml /app
# need to assemble to package in plugins
RUN mvn -f /app/pom.xml clean compile assembly:single
# Package stage
FROM openjdk:latest
COPY --from=build /app/target/seMethods-1.0-jar-with-dependencies.jar /usr/local/lib/build.jar
ENTRYPOINT ["java", "-jar", "/usr/local/lib/build.jar"]
这将使用 maven 构建 jar 文件。
App/src/App.java
// sql imports
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class App
{
public static void main( String[] args )
{
try {
String dbUrl = "jdbc:mysql://db:3306/world";
Connection con = DriverManager.getConnection(dbUrl,"root","password");
String testStatement = "SELECT * FROM city;";
PreparedStatement preparedTest = con.prepareStatement(testStatement);
ResultSet rs = preparedTest.executeQuery();
while(rs.next()){
System.out.println(rs.getRow());
}
} catch (Exception e) {
// handle any errors
System.out.println(String.format("Error: %s", e));
}
}
}
当我的 docker-compose 运行时,尽管我的应用停止并显示以下内容,但容器已创建:
Error: com.mysql.cj.jdbc.exceptions.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.
如何将我的 db
容器连接到 app
?
您正在尝试访问应用程序 docker 容器外的资源,但未在其上设置端口。默认情况下,您可能知道 docker 容器与系统隔离,因此您无法从容器内部访问端口 3306,而您可以从主机访问端口 3306。将端口添加到 docker 组合文件。
已解决。
创建数据库映像时,用于生成初始数据库的初始化文件需要几秒钟才能完成。在我的 java 应用程序的开头添加 Thread.sleep()
修补程序允许创建数据库表,然后我就可以连接了。
我有以下 docker-撰写:
version: '3.1'
services:
db:
container_name: db
image: mysql
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=world
volumes:
- ./mysql-db/:/docker-entrypoint-initdb.d
networks:
- my-network
app:
depends_on:
- db
container_name: app
build: App/
networks:
- my-network
networks:
my-network:
driver: bridge
这将构建 mysql
图像并使用本地文件创建数据库。我可以通过主机上的数据库客户端连接到数据库。 我知道数据库是 运行 并在端口 3306.
App/Dockerfile
:
# Build stage
FROM maven:latest AS build
COPY src /app/src
COPY pom.xml /app
# need to assemble to package in plugins
RUN mvn -f /app/pom.xml clean compile assembly:single
# Package stage
FROM openjdk:latest
COPY --from=build /app/target/seMethods-1.0-jar-with-dependencies.jar /usr/local/lib/build.jar
ENTRYPOINT ["java", "-jar", "/usr/local/lib/build.jar"]
这将使用 maven 构建 jar 文件。
App/src/App.java
// sql imports
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class App
{
public static void main( String[] args )
{
try {
String dbUrl = "jdbc:mysql://db:3306/world";
Connection con = DriverManager.getConnection(dbUrl,"root","password");
String testStatement = "SELECT * FROM city;";
PreparedStatement preparedTest = con.prepareStatement(testStatement);
ResultSet rs = preparedTest.executeQuery();
while(rs.next()){
System.out.println(rs.getRow());
}
} catch (Exception e) {
// handle any errors
System.out.println(String.format("Error: %s", e));
}
}
}
当我的 docker-compose 运行时,尽管我的应用停止并显示以下内容,但容器已创建:
Error: com.mysql.cj.jdbc.exceptions.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.
如何将我的 db
容器连接到 app
?
您正在尝试访问应用程序 docker 容器外的资源,但未在其上设置端口。默认情况下,您可能知道 docker 容器与系统隔离,因此您无法从容器内部访问端口 3306,而您可以从主机访问端口 3306。将端口添加到 docker 组合文件。
已解决。
创建数据库映像时,用于生成初始数据库的初始化文件需要几秒钟才能完成。在我的 java 应用程序的开头添加 Thread.sleep()
修补程序允许创建数据库表,然后我就可以连接了。