我有一个容器化为使用kafka-node库的linux容器的nodejs应用。
Kafka在运行Windows的主机上运行:
我使用以下命令运行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方法运行良好。
答案 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
连接容器内部:)