Docker与zookeeper、kafka和python脚本组成多容器,在Azure容器实例上无法连接到kafka.&



我正试图获得一个zookeeper/kafka非集群设置,以便能够与python脚本的容器交谈。我希望能够运行一个zookeeper/kafka容器和2个或更多的容器与python脚本通信zookeeper/kafka,所有运行在Azure上的容器或容器组。

为了测试这一点,我创建了下面的docker容器组,其中zookeeper和kafka作为两个服务,第三个服务启动一个简单的python脚本,以稳定的速度向kafka主题发送消息。docker-compose。我正在使用的xml文件如下:
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
container_name: zookeeper
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 22181:2181
networks:
- my-network
kafka:
image: confluentinc/cp-kafka:latest
container_name: kafka
depends_on:
- zookeeper
ports:
- 29092:29092
networks:
- my-network
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
kafka_producer:
build: ../kafka_producer
image: annabotkafka.azurecr.io/kafka_producer:v1
container_name: kafka_producer
depends_on:
- kafka
volumes:
- .:/usr/src/kafka_producer
networks:
- my-network
environment:
KAFKA_SERVERS: kafka:9092
networks:
my-network:
driver: bridge

kafka_producer.py脚本如下:

import os
from time import sleep
import json
from confluent_kafka import Producer
def acked(err, msg):
if err is not None:
print("Failed to deliver message: {0}: {1}"
.format(msg.value(), err.str()))
else:
print("Message produced: {0}".format(msg.value()))
# Function to send a status message out on the status topic
def send_status(producer,counter):
msg = {'counter':counter}
json_dump = json.dumps(msg)
producer.produce("counter", json_dump.encode('utf-8'), callback=acked)
producer.poll()
# Define kafkaProducer to push messages to the status topic
producer = Producer({'bootstrap.servers': 'kafka:9092'})
for j in range(9999):
print("Iteration", j)
send_status(producer, j)
sleep(2)

当我在我的Ubuntu 20.04开发机器上'docker-compose '这个时,我得到了预期的行为:一个固定的消息流发送给kafka生产者。

当我'docker-compuse push'这个镜像到Azure容器实例,并在Azure中用这个镜像创建一个容器后,kafka_producer脚本似乎不再能够连接到kafka:9092的kafka代理。

这些是启动后容器组的日志:

Iteration 0
%3|1629363616.468|FAIL|rdkafka#producer-1| [thrd:kafka:9092/bootstrap]: kafka:9092/bootstrap: Failed to resolve 'kafka:9092': Name or service not known (after 25ms in state CONNECT)
%3|1629363618.465|FAIL|rdkafka#producer-1| [thrd:kafka:9092/bootstrap]: kafka:9092/bootstrap: Failed to resolve 'kafka:9092': Name or service not known (after 22ms in state CONNECT, 1 identical error(s) suppressed)
Iteration 1
Iteration 2

我已经知道容器组在同一个网络子网上,并且在单个主机上,所以我希望它的操作与我在本地的开发机器上的操作相同。

我的下一步将是有不同的python脚本,我想要与kafka在这个容器组通信的单独的容器。在相同的容器组中拥有制作人脚本并不是我的长期期望,但我相信这种更简单的设置应该可以工作。

有什么建议我错了吗?

来自Azure文档

在一个容器组中,容器实例可以通过localhost相互访问

这让它听起来像容器正在使用主机网络,而不是像你在Compose中设置的Docker桥(你的代码工作良好)

因此,您应该连接localhost:29092

如果你不需要消息持久性,那么我建议在你的脚本之间通过HTTP, gRPC或Zeromq使用套接字,而不是Kafka容器

最新更新