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

Cap*_*das 0 node.js docker docker-network

我有一个 Nodejs 应用程序容器化为 Linux 容器,它使用 kafka-node 库。

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

  • 动物园管理员端口:2181
  • 卡夫卡经纪人端口:9092

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

docker container run  --network host --name nm name:1.0
Run Code Online (Sandbox Code Playgroud)

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

client = new kafka.KafkaClient({kafkaHost: "localhost:9092"});
Run Code Online (Sandbox Code Playgroud)

但这会抛出:

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
}
Run Code Online (Sandbox Code Playgroud)

当我将连接命令更改为:

client = new kafka.KafkaClient({kafkaHost: "host.docker.internal:9092"});
Run Code Online (Sandbox Code Playgroud)

我正进入(状态 :

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'
}
Run Code Online (Sandbox Code Playgroud)

有人可以建议我做错了什么吗?

更新

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

Ren*_*ino 5

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

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

我的例子:

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
Run Code Online (Sandbox Code Playgroud)

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