Docker部署Kafka+ZooKeeper出现连接拒绝、解析失败问题求助
Kafka访问异常解决方案
错误根因说明
你遇到的两个报错根源分别如下:
Failed to resolve 'broker:9092': Name or service not known:消费者容器没有和Kafka、Zookeeper在同一个Docker网络下,无法解析broker这个Docker内部主机名Connection refused:当前Kafka的监听器配置仅支持Docker内部网络访问,同时监听端口映射逻辑不符合跨环境访问要求,且你使用了已废弃的KAFKA_ADVERTISED_HOST_NAME参数
修复步骤
1. 修改docker-compose.yml的Kafka配置
调整broker的端口和环境变量,配置双监听器同时适配Docker内部网络、宿主机本地网络的访问需求:
--- version: '2' services: zookeeper: image: confluentinc/cp-zookeeper:6.1.0 hostname: zookeeper container_name: zookeeper ports: - "2181:2181" environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 broker: image: confluentinc/cp-kafka:6.1.0 hostname: broker container_name: broker depends_on: - zookeeper ports: - "9092:9092" - "29092:29092" environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181' KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:29092 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:9092,PLAINTEXT_HOST://localhost:29092 KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
配置说明:
- Docker内部网络的服务(比如消费者容器)通过
broker:9092访问Kafka - 宿主机本地运行的服务(比如你的生产者)通过
localhost:29092访问Kafka
2. 调整本地生产者配置
修改生产者的bootstrap地址为宿主机监听端口:
p = Producer({'bootstrap.servers': 'localhost:29092'})
3. 消费者容器加入Kafka所属的Docker网络
Docker Compose启动的服务默认会创建当前目录名_default格式的专属网络,你可以通过docker network ls查询实际网络名,启动消费者容器时指定加入该网络即可正常解析broker主机名:
docker run --network <替换为你的compose网络名> <你的消费者镜像名称>
如果消费者也通过Docker Compose管理,直接在消费者的compose配置中声明和Kafka使用同一个网络即可。
修改完成后重启所有服务即可解决两个报错。
内容的提问来源于stack exchange,提问作者Encrypto123
相关产品推荐
相关产品推荐

