Docker容器连接到主机的Kafka引发:错误:连接ECONNREFUSED 127.0.0.1:9092

时间:2020-01-17 11:39:55

标签: node.js docker docker-networking

我有一个容器化为使用kafka-node库的linux容器的nod​​ejs应用。

Kafka在运行Windows的主机上运行:

  • Zookeeper端口:2181
  • 卡夫卡经纪人港口:9092

我使用以下命令运行nodejs容器:

docker container run  --network host --name nm name:1.0

为了连接主机的kafka,我使用以下命令:

client = new kafka.KafkaClient({kafkaHost: "localhost:9092"});

但这会抛出:

Error: connect ECONNREFUSED 127.0.0.1:9092
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1126:14) {
  errno: 'ECONNREFUSED',
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '127.0.0.1',
  port: 9092
}

当我将connect命令更改为:

client = new kafka.KafkaClient({kafkaHost: "host.docker.internal:9092"});

我得到了:

TimeoutError: Request timed out after 30000ms
    at new TimeoutError (/usr/src/app/node_modules/kafka-node/lib/errors/TimeoutError.js:6:9)
    at Timeout._onTimeout (/usr/src/app/node_modules/kafka-node/lib/kafkaClient.js:491:14)
    at listOnTimeout (internal/timers.js:531:17)
    at processTimers (internal/timers.js:475:7) {
  message: 'Request timed out after 30000ms'
}

有人可以告诉我我在做什么错吗?

更新

切换到Linux主机时,上述localhost方法运行良好。

2 个答案:

答案 0 :(得分:0)

不是最佳答案,但是切换到Linux主机应该可以使第一种方法(localhost:IP)运行良好。

答案 1 :(得分:0)

同样的问题,但我可以解决

您必须在 Kafka 代理中使用域 KAFKA_ADVERTISED_HOST_NAME 设置环境变量 host.docker.internal:9092

我的例子:

version: '3'
services:
  zookeeper:
    image: wurstmeister/zookeeper
  kafka:
    image: wurstmeister/kafka
    ports:
    - "9092:9092"
    hostname: 'kafka-internal.io'
    environment:
      KAFKA_ADVERTISED_HOST_NAME: kafka-internal.io
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

现在我可以使用 kafka-internal.io:9092 连接容器内部:)