Cap*_*das 0 node.js docker docker-network
我有一个 Nodejs 应用程序容器化为 Linux 容器,它使用 kafka-node 库。
Kafka 在运行 Windows 的主机上运行:
我使用以下命令运行 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 方法运行得很好。
同样的问题,但我可以解决
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:)
| 归档时间: |
|
| 查看次数: |
9377 次 |
| 最近记录: |