docker - 无法连接到网络之外的kafka

标签 docker apache-kafka docker-compose

我正在尝试将我的作业连接到一个容器内,该容器将事件发送到另一个容器中的 kafka 集群。 无论我尝试什么,我都无法将事件发送到 kafka 主题 我已经尝试通过 telnet 和 kafkacat 访问我的 kafka 的地址监听器端口,一切正常:

Telnet output

Kafkacat output

这是我的作业撰写文件,“172.16.33.91”是我的本地 IP 地址:

version: '3'
services:
    events-processor:
        build:
            context: ./events-processor
        extra_hosts:
            - "host:172.16.33.91"
        restart: unless-stopped

这是我的作业代码,它将数据从 1 -> 1000 发送到现有主题num-test:

from time import sleep
from json import dumps
from kafka import KafkaProducer

if __name__=="__main__":
    producer = KafkaProducer(bootstrap_servers=['host:9093'],
                             value_serializer=lambda x: dumps(x).encode('utf-8'))
    for e in range(1000):
        data = {'number' : e}
        producer.send('numtest', value=data)
        print(data)
        sleep(5)

这是我的 kafka-zookeeper 撰写文件:

version: '3'

services: 
    zookeeper:
        image: confluentinc/cp-zookeeper
        environment:
            ZOOKEEPER_CLIENT_PORT: 2181
            ZOOKEEPER_TICK_TIME: 2000
        volumes:
            - zk-data:/var/lib/zookeeper/data
            - zk-logs:/var/lib/zookeeper/log
            - secrets:/etc/zookeeper/secrets
        restart: unless-stopped

    kafka:
        image: confluentinc/cp-kafka
        depends_on:
            - zookeeper
        ports: 
            - "9093:9093"
        environment:
            KAFKA_BROKER_ID: 1
            KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
            KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:9092,EXTERNAL://:9093
            KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT      
            KAFKA_LISTENERS: INTERNAL://:9092,EXTERNAL://:9093
            KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
            KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
        volumes:
            - kafka-data:/var/lib/kafka/data
            - secrets:/etc/kafka/secrets
        restart: unless-stopped

volumes:
    zk-logs: {}
    zk-data: {}
    kafka-data: {}
    secrets: {}

有人知道我做错了什么吗?任何帮助表示赞赏!!!

最佳答案

我记得遇到过类似的连接问题。事实证明,为了让您的容器能够访问主机上的端口,您可能需要向防火墙添加其他规则才能将其打开。

例如,使用 iptables,您可以添加如下规则,以允许主机接受来自 Docker 容器的请求。

-A INPUT -i docker0 -j ACCEPT

或者,您可以将作业容器放在与 kafka/zookeeper 相同的 docker 网络上。将应用程序放在同一个 docker-compose 文件中,或者使用通用的外部 docker 网络。

关于docker - 无法连接到网络之外的kafka,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60768433/

相关文章:

mysql - services.db.ports 必须是一个列表

docker - 如何使用 network_mode : "host" from external IP 访问运行 docker 的服务

docker - 如何在 Mesos 或 CoreOS 中配置 MariaDB 和 Redis 的高可用集群

linux - Docker、创建实例时 docker-compose 失败、运行时失败

docker - 使用nodetool远程检查cassandra的状态。错误:连接被拒绝

java - Kafka Stream with Avro in JAVA , schema.registry.url"没有默认值

apache-kafka - 无法找到任何实现 Connector 且名称与 com.mongodb.kafka.connect.MongoSinkConnector 匹配的类

python - 尝试使用MSBuild工具,Python,pip和Python依赖关系创建docker容器

apache-kafka - 无法在 Kafka 中创建主题

docker - 从 gRPC 服务器到 http 服务器的 http.Post() 在 docker-compose 设置上返回 EOF 错误