docker-compose启动Kafka时listener安全协议映射PLAINTEXT无效
Kafka Docker Compose 启动报错修复方案
核心报错触发原因
Invalid security protocol PLAINTEXT defined in listener.security.protocol.map 报错,根源来自配置语法错误、镜像配置错误、端口配置冲突三类问题,逐项修复即可。
逐项修复清单
修正镜像配置错误
原Kafka服务的镜像存在两处错误:- 镜像名拼写错误:
onfluentinc是拼写遗漏,正确的组织名是confluentinc - 镜像类型错误:原配置填的是Zookeeper专用镜像
cp-zookeeper,Kafka节点需使用对应Kafka的镜像confluentinc/cp-kafka:latest
若镜像配置错误,Kafka专属的环境变量无法被正确解析,会直接触发配置校验报错。
- 镜像名拼写错误:
删除已废弃的冗余配置
以下两项是Kafka 2.0之前的老旧配置,在当前多监听者模式下完全冗余,且会和新的监听配置产生冲突,直接删除即可:KAFKA_ADVERTISED_HOST_NAME=kafka-dockerKAFKA_ADVERTISE_HOST_PORT=9092
修复环境变量的语法格式问题
Docker Compose解析environment配置时,会自动保留等号两侧的多余空格,原配置里多处值前存在多余空格(比如KAFKA_LISTENERS= "xxx"、KAFKA_ADVERTISED_LISTENERS= INTERNAL1://xxx),会导致解析出的配置值带非法前置空格,进而让PLAINTEXT协议被识别为无效值。
修正规则:所有包含特殊字符、逗号、冒号的配置值,去掉等号两侧的多余空格后,整体用英文双引号包裹。统一监听端口的配置
原配置中内部监听的端口存在不一致问题:KAFKA_LISTENERS里INTERNAL1绑定的是9090端口KAFKA_ADVERTISED_LISTENERS里INTERNAL1广播的是9092端口
同时端口映射只暴露了9092,9090端口既没有被容器监听也没有对外映射,会直接导致连接异常,调整为和暴露端口一致的9092即可。
另外,对外提供服务的监听项(也就是EXTERNAL1),不要在KAFKA_LISTENERS里绑定localhost作为监听地址,需绑定0.0.0.0,否则容器内的服务无法正常接收宿主机器的连接请求。
补全依赖的Zookeeper服务配置
原配置里Kafka服务依赖了zookeeper服务,但没有在Compose里定义这个服务,会直接导致启动失败,需要新增对应的Zookeeper服务配置。
调整后可直接运行的完整配置
version: '3' services: zookeeper: image: confluentinc/cp-zookeeper:latest environment: - ZOOKEEPER_CLIENT_PORT=2181 - ZOOKEEPER_TICK_TIME=2000 kafka-docker: image: confluentinc/cp-kafka:latest ports: - "9092:9092" depends_on: - zookeeper environment: - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 - KAFKA_LISTENERS="INTERNAL1://kafka-docker:9092,EXTERNAL1://0.0.0.0:9092" - KAFKA_ADVERTISED_LISTENERS="INTERNAL1://kafka-docker:9092,EXTERNAL1://localhost:9092" - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP="INTERNAL1:PLAINTEXT,EXTERNAL1:PLAINTEXT" - KAFKA_INTER_BROKER_LISTENER_NAME="INTERNAL1" - KAFKA_CREATE_TOPICS="test:1:1"
内容的提问来源于stack exchange,提问作者Hasnain Ali Bohra
相关产品推荐
相关产品推荐

