我知道这个问题经常出现。我读过很多帖子和博客,但我在这里。长话短说,我有一个docker容器运行wurstmeister/zookeeper&wurstmeister/kafka,然后一些服务在它们自己的容器中运行。我现在只提noddj一个。在家里一切都很好,使用ip地址(而不是本地主机),所以我对这里的区别感到困惑。在aws上,它只是“不起作用”,尽管它似乎至少在一开始就连接到了代理。我在配置中显式地使用内部IP,因为我不希望它暴露在任何外部。
在阅读中,我尝试了两种设置。1.在家工作(Kafka\主持人\姓名)。1没有(Kafka的听众)。在我的ec2 linux设备上都不起作用:
Kafkadocker-compose.yml
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
networks:
- my-network
kafka:
image: wurstmeister/kafka
depends_on:
- zookeeper
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: <internal-ip>
KAFKA_ADVERTISED_PORT: "9092"
KAFKA_CREATE_TOPICS: "test:1:1"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- my-network
networks:
my-network:
nodejs docker-compose.yml文件
version: '2'
services:
nodejs:
build:
context: ./
dockerfile: Dockerfile
networks:
- kafka_my-network
restart: unless-stopped
ports:
- "1337:3000"
volumes:
- "/tmp:/tmp"
- "/var/log:/var/log"
networks:
kafka_my-network:
external: true
然后在nodejs
const kafkaHost = '<internal-ip>:9092';
const client = new kafka.KafkaClient({kafkaHost});
const producer = new kafka.Producer(client)
const kakfaTopic = 'test';
producer.on('ready', function() {
console.log(`kafka producer is ready`); // I see this, so I'm assuming all is well
ready = true;
});
producer.on('error', function(err) {
console.error(err);
});
const payload = [
{
topic: kafkaTopic,
messages: JSON.stringify(myMessages);
}
]
producer.send(payload, function(err, data) {
if (err) {
console.error(`Send error ${JSON.stringify(err}`);
}
console.log(`Sent data ${JSON.stringify(data)}`);
});
当我启动nodejs服务器时,我看到我已经连接到一个kafka代理。我也可以确认:9092在检查w/telnet和/或nc后是打开的。然后,当它发送请求时,回调得到一个空错误。
我意识到kakfa\u播发的\u主机\u名称已被弃用,因此以完成的名义,下面是我使用播发的\u侦听器的尝试,但失败了。通过这种配置,我在家里得到的结果似乎和在ec2上得到的结果一样。
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
networks:
- my-network
kafka:
image: wurstmeister/kafka
depends_on:
- zookeeper
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://<internal-ip>:9092
KAFKA_CREATE_TOPICS: "test:1:1"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- my-network
networks:
my-network:
编辑:我不会提供这个作为解决方案,但bitnami图像与以下配置工作。主要的区别是它有一个非常直接的自述,我通过。我不能确定我是否尝试了等效的配置w/wurstmeister(我尝试了很多次,而且一次又一次,其中至少有一次是在我自己的机器上的docker容器中,但不是在一个ec2示例上)。
请注意,我确实在/etc/hosts中列出了带有内部ip(而不是环回)的“kafka”。这应该等同于显式地使用我在上面所做的内部ip。
version: '2'
services:
zookeeper:
image: 'bitnami/zookeeper:3'
ports:
- '2181:2181'
volumes:
- 'zookeeper_data:/bitnami'
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
networks:
- my-network
kafka:
image: 'bitnami/kafka:2'
ports:
- '9092:9092'
- '29092:29092'
volumes:
- 'kafka_data:/bitnami'
- /var/run/docker.sock:/var/run/docker.sock
environment:
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,PLAINTEXT_HOST://:29092
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
depends_on:
- zookeeper
networks:
- my-network
volumes:
zookeeper_data:
driver: local
kafka_data:
driver: local
networks:
my-network:
driver: bridge
暂无答案!
目前还没有任何答案,快来回答吧!