Ошибка ввода-вывода: сетевому адаптеру не удалось установить соединение при запуске oracle DB в качестве док-контейнера - PullRequest
2 голосов
/ 08 июля 2019

На основании:

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

Я использую oracle express db в качестве контейнера докера. С моей операционной системы (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>

Теперь я хотел бы запустить еще один докер-контейнер и запустить небольшое Java-приложение, которое подключается к базе данных Oracle. 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 образа контейнера (который вызывается в ENTRYPOINT в файле docker) для этого приложения у меня есть

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

где я получил 172.18.0.2, запустив ifconfig в контейнере оракула. Но я получаю эту ошибку:

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

И я убедился, что перечисленные банки находятся в ожидаемом месте в контейнере приложения-образца.

Некоторые детали докера. Я запускаю контейнер оракула с:

  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

поэтому они работают в одной сети.

Почему происходит сбой соединения с оракулом DB, когда оно выполняется внутри контейнера примера приложения Java?

Также, если я запускаю класс samples.JDBCExample на моем хосте с jdbc:oracle:thin:@//localhost:32118/xe, используя тот же самый пример приложения jar и файл ojdc8.jar, он работает нормально (печатая Connected to the database!, как и ожидалось).

1 Ответ

1 голос
/ 08 июля 2019

Вы подключаете оба ваших контейнера к одной и той же сети, чтобы ваши контейнеры могли обмениваться данными через эту сеть, а имена континентов будут именами DNS, разрешенными по их IP-адресу.

Таким образом, ваша строка подключения должна выглядеть следующим образом:

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

и oracle-xe будут преобразованы в IP-адрес контейнера базы данных в этой общей сети.А также помните про порт.Я предполагаю, что ваша БД будет выставлена ​​на 1521 порт в контейнере БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...