【发布时间】:2021-11-28 05:40:30
【问题描述】:
我已经在 docker 中设置了一个 kafka-zookeeper compose 和三个监听器:
- 内部端口 9092
- EXTERNAL_SAME_HOST 在 29092
- 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