当前位置: 首页 > 知识库问答 >
问题:

Docker在无法连接到kafka的Azure容器实例上使用zookeeper、kafka和python脚本编写多容器

宗政天逸
2023-03-14

我正在尝试使用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通信。将生产者脚本放在同一个容器组中不是我的长期期望,但是我相信这个更简单的设置应该可以工作。

我哪里出错了,有什么建议吗?

共有1个答案

顾池暝
2023-03-14

来自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时,我在线程