IO错误:将oracle DB作为docker容器运行时,网络适配器无法建立连接

时间:2019-07-08 12:30:29

标签: java oracle docker

基于:

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

我正在将oracle express数据库作为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 db的小型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容器中运行172.18.0.2得到ifconfig的位置。但是我得到这个错误:

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

我已经验证了上面列出的罐子在示例应用程序容器中的预期位置。

一些docker详细信息。我用以下命令启动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时连接失败?

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

1 个答案:

答案 0 :(得分:1)

您将两个容器都连接到同一网络,这样您的容器将能够在该网络上进行通信,并且域名将成为解析为其IP的DNS名称。

因此您的连接字符串应类似于:

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

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