那么设置在哪里呢。2个写文件,快4个了。所有内容都不能存在于同一个compose文件中,因为它分布在不同的项目中。所以让我大吃一惊的是,如果我在kafka docker compose中放置一个基本的ngnix服务器,我就可以很好地将我的节点应用程序连接到它上。。。但我无法连接到Kafka。。。如果我在docker外运行我的节点应用程序,我可以很好地连接到kafka。。。不知道为什么我不能和Kafka联系上。
# Micro Services that connect to kafka
version: '3.5'
services:
grouping:
build:
dockerfile: grouping.docker
context: .
container_name: grouping
ports:
- "8080:8080"
networks:
- kafka-network
- notifications-network
sending:
build:
dockerfile: sending.docker
context: .
container_name: sending
ports:
- "8081:8081"
networks:
- kafka-network
- notifications-network
depends_on:
- grouping
networks:
kafka-network:
external: true
notifications-network:
driver: bridge
name: notifications-network
# Kafka
version: '3.5'
services:
zookeeper:
image: "confluentinc/cp-zookeeper"
container_name: zookeeper
ports:
- "2181:2181"
networks:
- kafka-network
- notifications-network
environment:
ZOOKEEPER_CLIENT_PORT: 2181
kafka:
image: "confluentinc/cp-kafka"
container_name: kafka
ports:
- "9092:9092"
networks:
- kafka-network
- notifications-network
depends_on:
- zookeeper
environment:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
web:
image: nginx
command: [nginx-debug, '-g', 'daemon off;']
container_name: web
ports:
- "1337:80"
networks:
- kafka-network
networks:
kafka-network:
driver: bridge
name: kafka-network
notifications-network:
external: true
使用 kafka-node
与 config
我就这样联系在一起
const kafkaConfig = config.get('kafka');
const kafkaClient = new kafka.KafkaClient({kafkaHost: kafkaConfig.host});
const consumer = bluebird.promisifyAll(new kafka.Consumer(kafkaClient, [{topic: kafkaConfig.topic}], {autoCommit: false}), {multiArgs: true});
我试过:
kafkaConfig.host = 'kafka:9092'
kafkaConfig.host = 'http://kafka:9092'
kafkaConfig.host = 'kafka'
kafkaConfig.host = 'http://kafka'
我错过了什么?一定很简单吧?
docker network ls显示:
NETWORK ID NAME DRIVER SCOPE
ee3aceffe54b bridge bridge local
b05926fff0ed host host local
18c96f1f6d2d kafka-network bridge local
391880718a8b none null local
19e81dea1d65 notifications-network bridge local
使用request,我可以从grouping或sending服务连接到grouping、sending和web服务。
const request = require('request');
request.get('http://sending:8081', (err, res) => logger.info('Got from sending:', err, res && res.body));
request.get('http://grouping:8080', (err, res) => logger.info('Got from grouping:', err, res && res.body));
request.get('http://web', (err, res) => logger.info('Got from kafka web:', err, res && res.body));
// Returns a peer reset connection error, which is different from the not found error.
request.get('http://kafka:9092', (err, res) => logger.info('Got from kafka web:', err, res && res.body));
只是一个更新:所以web服务在kafka网络上,我的其他服务可以连接到它,他们甚至可以尝试发送到kafka的连接,但是kafka没有web服务,并且重置了对等方。所以他们可以和Kafka谈谈,但Kafka并没有按预期的那样工作。我还收到一封信 Broker not available
当我的kafka客户端尝试在docker容器内连接时出错。
2条答案
按热度按时间vecaoik11#
为了能够从compose网络中的进程和外部连接,您需要在内部通告两个侦听器plaintext://kafka:9092与上一个答案相同,一个用于外用:external://localhost:9093
使用内部和外部客户端访问kafka为了使用内部和外部客户端访问kafka代理,您需要为每种客户端配置一个侦听器。
为此,请将以下环境变量添加到docker compose中:
这来自bitnami图像:https://github.com/bitnami/bitnami-docker-kafka 但合流的Kafka形象也应该如此
wb1gzix02#
我甚至可以肯定,如果这是一个有效的答案,但简而言之,上面的工作只是与您使用的罚款kafka:9092 as 主机名。我的dockerginore文件忽略了local.json,所以我正在编辑的文件从未被复制过。。。
更新:配置只是答案的一部分,Kafka的环境变量的另一部分。
我们不需要这样
localhost:9092
,但作为kafka:9092
显然我已经和Zookeeper一起做过了,但从未意识到。