如何在Docker中连接外部Oracle数据库

4
我正在尝试连接位于 Docker 容器之外的 Oracle 数据库。我对 Docker 不熟悉,不确定如何实现相同的操作。在我的本地机器上,我可以通过提供主机、服务名称和端口或仅引用 tnsnames.ora 文件中提到的条目来连接到特定数据库。我已经在我的 Windows 10 机器上安装了 Docker。我的最终目标是使用 ksqlDB 将我的表流传到 kafka 主题。但是,第一步是连接到我的 Oracle 数据库。我不确定需要哪些修改或设置才能从 Docker 连接到任何外部数据库源。我尝试了下面的连接器配置,但这不起作用。
CREATE SOURCE CONNECTOR jdbc_source WITH(
'connector.class'       =   'io.confluent.connect.jdbc.JdbcSourceConnector',
'connection.url'        =   'jdbc:oracle:thin://dv11-db.com:1521/dv11.db.com',
'connection.user'       =   'user',
'connection.password'   =   'password',
'topic.prefix'          =   'jdbc_',
'mode'                  =   'bulk',
'table.whitelist'       =   'batch_driver'
);

错误:

{
  "error_code" : 400,
  "message" : "Connector configuration is invalid and contains the following 2 error(s):\nInvalid value java.sql.SQLException: No suitable driver
found for jdbc:oracle:thin://dv11-db.com:1521/dv11.db.com for configuration Couldn't open connection to jdbc:oracle:thin://dv11-db.com:1521/dv11.db.com\nInvalid value java.sql.SQLException: No suitable driver found for jdbc:oracle:thin://dv11-db.com:1521/dv11.db.com for configuration Couldn't open connection to jdbc:oracle:thin://dv11-db.com:1521/dv11.db.com\nYou can also find the above list of errors at the endpoint `/{connectorType}/config/validate`"
}

Oracle配置:

(DESCRIPTION =    (ADDRESS = (PROTOCOL = TCP)(HOST = dv11-db.com)(PORT = 1521))    (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = dv11.db.com)))

Docker-compose.yml

---
version: '2'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    hostname: zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  broker:
    image: confluentinc/cp-enterprise-kafka:latest
    hostname: broker
    container_name: broker
    depends_on:
      - zookeeper
    ports:
      - "29092:29092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:9092,PLAINTEXT_HOST://localhost:29092
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1

  ksqldb-server:
    image: confluentinc/ksqldb-server:0.7.0
    hostname: ksqldb-server
    container_name: ksqldb-server
    depends_on:
      - broker
    ports:
      - "8088:8088"
    environment:
      KSQL_LISTENERS: http://0.0.0.0:8088
      KSQL_BOOTSTRAP_SERVERS: broker:9092
      KSQL_KSQL_LOGGING_PROCESSING_STREAM_AUTO_CREATE: "true"
      KSQL_KSQL_LOGGING_PROCESSING_TOPIC_AUTO_CREATE: "true"
      KSQL_KSQL_CONNECT_WORKER_CONFIG: "/connect/connect.properties"
      KSQL_CONNECT_GROUP_ID: "ksql-connect-cluster"
      KSQL_CONNECT_BOOTSTRAP_SERVERS: "broker:9092"
      KSQL_CONNECT_KEY_CONVERTER: "org.apache.kafka.connect.storage.StringConverter"
      KSQL_CONNECT_VALUE_CONVERTER: "org.apache.kafka.connect.json.JsonConverter"
      KSQL_CONNECT_VALUE_CONVERTER_SCHEMAS_ENABLE: "false"
      KSQL_CONNECT_CONFIG_STORAGE_TOPIC: "ksql-connect-configs"
      KSQL_CONNECT_OFFSET_STORAGE_TOPIC: "ksql-connect-offsets"
      KSQL_CONNECT_STATUS_STORAGE_TOPIC: "ksql-connect-statuses"
      KSQL_CONNECT_CONFIG_STORAGE_REPLICATION_FACTOR: 1
      KSQL_CONNECT_OFFSET_STORAGE_REPLICATION_FACTOR: 1
      KSQL_CONNECT_STATUS_STORAGE_REPLICATION_FACTOR: 1
      KSQL_CONNECT_PLUGIN_PATH: "/usr/share/kafka/plugins"
  volumes:
      - ./confluentinc-kafka-connect-jdbc-5.4.0:/usr/share/kafka/plugins/jdbc 

  ksqldb-cli:
    image: confluentinc/ksqldb-cli:0.7.0
    container_name: ksqldb-cli
    depends_on:
      - broker
      - ksqldb-server
    entrypoint: /bin/sh
    tty: true
1个回答

2

java.sql.SQLException: 找不到适当的驱动程序

这不是Docker的问题。您没有将数据库驱动程序放在正确的位置。

它不应该放在/usr/share/kafka/plugins/jdbc中。

它应该放在/usr/share/kafka-connect-jdbc中。

请参考https://www.confluent.io/blog/kafka-connect-deep-dive-jdbc-source-connector/

在我的本地机器上,我可以通过提供主机名、服务名称和端口或只是引用tnsnames.ora文件中提到的条目来连接到特定的数据库

不清楚你如何连接……从代码?从Oracle工具?

如果您的数据库在另一台服务器上,Docker的网络连接应该以完全相同的方式工作。您仍然需要设置您的驱动程序。


谢谢您的回复。我已按建议编辑了我的docker-compose.yml文件。但现在,我正在收到以下错误: error_code" : 500, "message" : "无法找到任何实现Connector并其名称与io.confluent.connect.jdbc.JdbcSourceConnector匹配的类,可用连接器为: PluginDesc{klass=class org.apache.kafka.connect.tools.MockConnector, name='org.apache.kafka.connect.tools.MockConnector', version='5.5.0-ccs-beta200204173843', encodedVersion=5.5.0-ccs-beta200204173843, type=connect....等等.... - Praveenks
为什么你在使用5.5的beta版本呢?请不要使用最新的标签。尝试使用5.4.0。 - OneCricketeer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接