gpt4 book ai didi

java - IO 错误 : The Network Adapter could not establish the connection when running oracle DB as docker container

转载 作者:行者123 更新时间:2023-11-30 10:02:28 25 4
gpt4 key购买 nike

基于:

https://github.com/fuzziebrain/docker-oracle-xe

我正在运行一个 oracle express db 作为 docker 容器。从我的主机操作系统(ubuntu 19.04)我可以使用以下方法成功连接到数据库:

$ sqlplus sampleschema/12345@localhost:32118/XE
Connected to:
Oracle Database 18c Express Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0

SQL>

现在我想启动另一个 docker 容器并运行一个连接到 oracle 数据库的小型 java 应用程序。我正在运行的 java 应用程序是 JDBCExample 的略微修改版本:

https://www.mkyong.com/jdbc/connect-to-oracle-db-via-jdbc-driver-java/

package samples;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JDBCExample {

public static void main(String[] args) {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

String jdbcUrl="jdbc:oracle:thin:@//localhost:32118/xe";
if (args.length > 0) {
jdbcUrl=args[0];
System.out.println ("JDBC URL is: " + jdbcUrl);
}

try (Connection conn = DriverManager.getConnection(
jdbcUrl, "sampleschema", "12345")) {
if (conn != null) {
System.out.println("Connected to the database!");
} else {
System.out.println("Failed to make connection!");
}

} catch (SQLException e) {
System.err.format("SQL State: %s\n%s", e.getSQLState(), e.getMessage());
} catch (Exception e) {
e.printStackTrace();
}

}
}

在容器镜像的 run.sh 脚本中(在 dockerfile 的 ENTRYPOINT 中调用)我有

JDBC_URL="jdbc:oracle:thin:@//172.18.0.2:32118/xe"
java -cp "/opt/sample:/opt/sample/ojdbc8.jar:/opt/sample/sample-app-1.0.1-SNAPSHOT.jar" samples.JDBCExample $JDBC_URL

我通过在 oracle 容器中运行 ifconfig 获得了 172.18.0.2。但是我得到这个错误:

SQL State: 08006
IO Error: The Network Adapter could not establish the connection

而且我已经验证上面列出的 jar 位于示例应用程序容器中的预期位置。

一些 jetty 细节。我用以下命令启动 oracle 容器:

  docker run \
-p 32118:1521 \
-p 35518:5500 \
--name=oracle-xe \
--network=sample-network \
oracle-xe:18c

和示例应用程序容器:

  docker run --network=sample-network -it --name debug-app-container debug-app-image

因此它们在同一网络上运行。

为什么在示例 java 应用程序容器中执行时连接到 oracle DB 失败?

此外,如果我使用完全相同的示例应用程序在我的主机上运行 samples.JDBCExamplejdbc:oracle:thin:@//localhost:32118/xe jar 和 ojdc8.jar 文件它工作正常(按预期打印 Connected to the database!)。

最佳答案

您将两个容器连接到同一个网络,这样您的容器就可以通过该网络进行通信,并且大陆名称将是解析到其 IP 的 DNS 名称。

所以你的连接字符串应该是这样的:

jdbc:oracle:thin:@//oracle-xe:1521/xe

oracle-xe 将通过该公共(public)网络解析为数据库容器 IP。还要记住端口。我假设您的数据库将在数据库容器的 1521 端口公开。

关于java - IO 错误 : The Network Adapter could not establish the connection when running oracle DB as docker container,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56935007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com