【问题标题】:Kafka communication inside docker network fails, outside of docker works [duplicate]docker网络内的Kafka通信失败,在docker工作之外[重复]
【发布时间】:2021-11-28 05:40:30
【问题描述】:

我已经在 docker 中设置了一个 kafka-zookeeper compose 和三个监听器:

  1. 内部端口 9092
  2. EXTERNAL_SAME_HOST 在 29092
  3. EXTERNAL_DIFFERENT_HOST 在 29093

带有 docker 的服务器的 IP 为 192.168.66.66。 我对其进行了测试,可以通过我的 kafka-python 测试脚本访问 2 和 3。 但是,1(从容器内部测试)未能抛出“没有可用的经纪人”。 我在 INTERNAL 方面做错了什么?

我的 docker-compose.yml:

version: "3.8"
services:
  #########
  # Kafka #
  #########

  zookeeper:
    container_name: zookeeper
    image: wurstmeister/zookeeper

    networks:
      - kafka_network

    ports:
      - "2181:2181"

  kafka:
    container_name: kafka
    image: wurstmeister/kafka

    networks:
      - kafka_network

    ports:
      - "29092:29092"
      - "29093:29093"

    expose:
      - "9092"

    environment:
      # Using three ways to reach kafka: From INSIDE docker (Other containers), from outside docker but running on the same server as docker (EXTERNAL_SAME_HOST), and from another computer.
      KAFKA_LISTENERS: EXTERNAL_SAME_HOST://:29092,EXTERNAL_DIFFERENT_HOST://:29093,INTERNAL://:9092
      
      # Publishing the above ports
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:9092,EXTERNAL_SAME_HOST://localhost:29092,EXTERNAL_DIFFERENT_HOST://192.168.66.66:29093
      
      # Setting the security protocol for all three listeners to PLAINTEXT
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL_SAME_HOST:PLAINTEXT,EXTERNAL_DIFFERENT_HOST:PLAINTEXT
      
      # Settings for zookeeper-kafka-communication
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      
      # Create Kafka topics "NAME:PARTITION:REPLICAS:RETENTION_POLICY,..."
      KAFKA_CREATE_TOPICS: "debug:1:1:delete,debug2:1:1:delete" # Some test topics for debugging purposes
      
      # To encourage correct API use, forbid automatic topic creation (Only topics created by an explicit command or the topic creation above can be used. Prevents typos)
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'false'

    depends_on:
      - zookeeper

    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

networks:
  kafka_network:
    name: kafka
    driver: bridge

我的 kafka-python 测试 producer.py:

from kafka import KafkaProducer
import json
import time

kafka_ip = 'kafka:9092'
topic = 'debug'

producer = KafkaProducer(bootstrap_servers=[kafka_ip],
                         value_serializer=lambda x:
                         json.dumps(x).encode('utf-8'))

while True:
    data = 'INTERNAL listener test'
    producer.send(topic, value=data)
    time.sleep(1)

还有我用于生产者的 dockerfile:

FROM python:3.8-alpine
COPY requirements.txt /
RUN pip install -r requirements.txt
COPY src/ /
CMD [ "python", "./producer.py" ]

我通过

创建了容器
docker build --no-cache -t kafka_internal_test_producer .

并运行它

docker run -d --name kafka_internal_test_producer kafka_inter
nal_test_producer

【问题讨论】:

  • 您的生产者是否与代理运行在同一个 Docker 网络上?另请查看这篇文章以获取有关调试此问题的有用提示:confluent.co.uk/blog/…
  • 谢谢罗宾!生产者确实在错误的网络上 - 我通过 portainer 将生产者容器的网络设置为“kafka”,也可以在控制台上使用 docker connect)现在它可以工作了。 docs.docker.com/engine/reference/commandline/network_connect
  • ????????很高兴它已排序。
  • 你的“其他主机”监听地址可以被Docker主机使用;它只是在不同的网络接口上响应。所以你真的只需要两个监听器——Docker 服务名和 LAN IP

标签: docker apache-kafka


【解决方案1】:

查看问题下的 cmets,生产者在错误的网络上运行。通过 docker connect/porttainer UI 将其设置为“kafka”。感谢@Robin Moffatt 的快速解决方案!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 2021-08-18
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多