我正在尝试使用zookeeper/kafka非集群设置,以便能够使用python脚本与容器对话。我希望能够运行一个zookeeper/kafka容器和2个或多个容器,其中包含与zookeeper-kafka通信的python脚本,所有这些容器都在Azure上的容器或容器组中运行。
为了测试这一点,我创建了下面的docker容器组,其中zookeeper和kafka作为2个服务,第3个服务启动一个简单的python脚本,以稳定的速度向kafka主题发送消息。码头工人作曲。我使用的yml如下:
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 dev机器上“docker-compose”这个时,我得到了预期的行为:一个稳定的消息流被发送到kafka producer。
在我将它“docker-compuse push”到Azure容器实例并在Azure中创建一个带有图像的容器后,kafka_producer脚本似乎不再能够连接到kafka:9092上的kafka broker。
这些是启动后容器组的日志:
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相互联系,即使这些端口没有在组的IP地址或容器上对外公开。
这听起来像是容器正在使用主机网络,而不是您在 Compose 中设置的 Docker 桥(您的代码工作正常)
因此,您应该连接到localhost:29092
如果你实际上不需要消息持久性,那么我建议在你的脚本之间通过HTTP,gRPC或Zeromq使用套接字,而不是Kafka容器。
我正在尝试从另一个码头工人容器连接到 kafka docker 容器。但它没有连接。 为了运行kafka和zookeeper,我使用了docker compose文件: 容器docker compose 17138956372294708100 _ kafkatest . producer _ 1和docker compose 17138956372294708100 _ kafkatest .
在与docker和kafka的基础上磕磕绊绊,无法获得客户端连接 到目前为止我所做的 docker-机器活动,不返回活动主机 我的groovy类(从一个示例中剪切和粘贴,连接如下所示 当我运行这个init时,我得到的错误是它不能解析连接,因为java.io.ioException:不能解析地址:7BF9F9278E64:9092,这是内部容器端口。(我的脚本正在从我的普通IDE桌面环境中调用) 感
我使用的示例是:https://clubhouse.io/developer-how-to/how-to-set-up-a-hadoop-cluster-in-docker/ 我首先用:docker-compose up-d开始HDFS 然后我用debezium网站上的图片启动了动物园管理员Kafka和mysql。https://debezium.io/documentation/referenc
我正在运行一个spring boot应用程序,它会侦听IBM消息中心Kafka,然后将其存储到IBM云上的compose for mongoDB中。 在一起运行Kafka和Compose for MongoDB时,我遇到了一个与SSL证书相关的错误。 我正在为mongoDB证书使用compose并使用有效的信任存储和密钥。 如果我在Spring靴中使用嵌入式mongo,那么一切都很好。 到目前为止
我正在Windows 10 Home上使用Docker运行Landoop(图像)容器,使用WSL2。我可以做一个码头工人。具有多个服务的yaml文件: 从现在开始,我只运行到连接用户界面服务,根据配置文件,连接用户界面服务应该绑定在端口8084上。当我尝试访问其他服务,如kafka或模式注册服务时,我能够通过以下方式看到相应端口上的输出:
我正在使用wurstmeister的docker-kafka项目在容器中运行kafka/zoomaster。我使用docker-comup将容器localhost作为变量。 我已经编写了一个Java应用程序,它使用flink连接并使用这个Kafka容器的一个主题。如果我导出一个可运行的罐子,并从我的机器上运行它,它绝对可以正常工作。当我创建下面的图像以从另一个docker容器运行jar时,我在线程