问题使用nodejs kafka和docker,解析的主机是容器id

o7jaxewo  于 2021-06-07  发布在  Kafka
关注(0)|答案(1)|浏览(449)

我有一个centos7.5vm正在运行,我正在尝试将zookeeper/kafka服务器运行到一个容器中(使用docker compose)。
我正在使用kafka节点(2.6.1)来使用kafka。当直接在虚拟机上运行时,一切正常。但是当kafak服务器被停靠时,有一个与ipv6相关的问题。
当我使用 /bin/kafka-topics.sh 在容器外部(在主机上)时编写脚本,表示容器正常,端口(21819092)已打开。
以下是我使用的版本:

//CentOS Version
SB Version:    :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description:    CentOS Linux release 7.5.1804 (Core)
Release:        7.5.1804
Codename:       Core

//nodejs verison
5.3.0

//kafka version
2.11-2.0.0

// docker version
Client:
 Version:           18.06.0-ce
 API version:       1.38
 Go version:        go1.10.3
 Git commit:        0ffa825
 Built:             Wed Jul 18 19:08:18 2018
 OS/Arch:           linux/amd64
 Experimental:      false
Server:
 Engine:
  Version:          18.06.0-ce
  API version:      1.38 (minimum version 1.12)
  Go version:       go1.10.3
  Git commit:       0ffa825
  Built:            Wed Jul 18 19:10:42 2018
  OS/Arch:          linux/amd64
  Experimental:     false

//docker compose version
docker-compose version 1.21.2, build a133471
docker-py version: 3.4.1
CPython version: 2.7.5
OpenSSL version: OpenSSL 1.0.2k-fips  26 Jan 2017

以下是我的nodejs脚本,当kafka在主机上时可以正常工作,但当kafka在docker中时则不行:

var fs = require('fs'),
    kafka = require('kafka-node'),
    path = require('path'),
    cassandra = require('cassandra-driver'),
    moment = require('moment');
//Producer
const client = new kafka.Client("127.0.0.1:2181");

const producer = new kafka.HighLevelProducer(client);
var interval;
console.log('Hello');

producer.on("ready", function () {
    console.log("Ingestion Complete Event Producer is connected and ready.");
    interval = setInterval(function () {
        _scanDirectoryAndTagReport();
    }, (process.argv[2] || 1500));
});
producer.on('error', function(err) {
    console.log('error', err);

});

下面是我从vm运行这个脚本时得到的输出:

Hello
Ingestion Complete Event Producer is connected and ready.
error { Error: getaddrinfo ENOTFOUND d98e973bc4a7 d98e973bc4a7:9092
    at errnoException (dns.js:28:10)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:79:26)
  code: 'ENOTFOUND',
  errno: 'ENOTFOUND',
  syscall: 'getaddrinfo',
  hostname: 'd98e973bc4a7',
  host: 'd98e973bc4a7',
  port: '9092' } 
error { Error: getaddrinfo ENOTFOUND d98e973bc4a7 d98e973bc4a7:9092
    at errnoException (dns.js:28:10)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:79:26)
  code: 'ENOTFOUND',
  errno: 'ENOTFOUND',
  syscall: 'getaddrinfo',
  hostname: 'd98e973bc4a7',
  host: 'd98e973bc4a7',
  port: '9092' } 
  error { Error: getaddrinfo ENOTFOUND d98e973bc4a7 d98e973bc4a7:9092
    at errnoException (dns.js:28:10)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:79:26)
  code: 'ENOTFOUND',
  errno: 'ENOTFOUND',
  syscall: 'getaddrinfo',
  hostname: 'd98e973bc4a7',
  host: 'd98e973bc4a7',
  port: '9092' } 
  error { Error: getaddrinfo ENOTFOUND d98e973bc4a7 d98e973bc4a7:9092
    at errnoException (dns.js:28:10)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:79:26)
  code: 'ENOTFOUND',
  errno: 'ENOTFOUND',
  syscall: 'getaddrinfo',
  hostname: 'd98e973bc4a7',
  host: 'd98e973bc4a7',
  port: '9092' } 
  error { Error: getaddrinfo ENOTFOUND d98e973bc4a7 d98e973bc4a7:9092
    at errnoException (dns.js:28:10)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:79:26)
  code: 'ENOTFOUND',
  errno: 'ENOTFOUND',
  syscall: 'getaddrinfo',
  hostname: 'd98e973bc4a7',
  host: 'd98e973bc4a7',
  port: '9092' } 
  error { Error: getaddrinfo ENOTFOUND d98e973bc4a7 d98e973bc4a7:9092
    at errnoException (dns.js:28:10)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:79:26)
  code: 'ENOTFOUND',
  errno: 'ENOTFOUND',
  syscall: 'getaddrinfo',
  hostname: 'd98e973bc4a7',
  host: 'd98e973bc4a7',
  port: '9092' }

错误消息正在循环。
有人有线索吗?
祝您有个美好的一天,
奈托弗
编辑1:正如在评论中指出的,这不是一个与ipv6相关的问题,但问题是我的生产者解决的主机是容器id

bpzcxfmw

bpzcxfmw1#

我找到了一个解决方案,您可以在docker-compose.yml中指定一个主机名,并将nodejs客户机设置为连接到该主机名。
以下是.yml:

version: '3'

services:
  kafkazoo:
    build: ./kafka
    hostname: kafkazoo
    ports:
      - 9092:9092
      - 2181:2181
  data_input_service:
    build: ./data_input_service
    # environment:
    #   - SCRIPT_NAME=pull_data_service.js
    volumes: 
      - /predix/shared/linux_shared/JSON_REPORTS:/data/JSON_REPORTS
    depends_on: 
      - kafkazoo
  external_pull_data_service:
    build: ./external_pull_data_service
    # environment:
    #   - SCRIPT_NAME=report_generator.js
    volumes: 
      - /predix/shared/linux_shared/JSON_REPORTS:/data/JSON_REPORTS
    depends_on: 
      - kafkazoo

如您所见,我添加了hostname:kafakazoo,这是新的kafka客户端:

const client = new kafka.Client("kafkazoo:2181");

const producer = new kafka.HighLevelProducer(client);

这个很好用
多亏了迈克尔·汉普顿

相关问题