使用Docker Compose搭建多Broker Kafka集群实例启动失败问题
问题排查步骤
第一步:先定位具体报错原因
- 执行
docker ps -a查看所有容器(包含已退出的),确认你的kafka、zookeeper容器是否处于Exited状态 - 分别查看容器日志定位错误:
- zookeeper日志:
docker logs zoom - kafka1日志:
docker logs kafkacont1 - kafka2日志:
docker logs kafkacont2
- zookeeper日志:
第二步:你的配置中存在的已知明显错误
错误1:缺少KAFKA_LISTENERS配置
你只配置了KAFKA_ADVERTISED_LISTENERS(对外宣告的监听地址),没有配置KAFKA_LISTENERS(kafka实际绑定监听的端口),导致kafka启动后找不到绑定的端口直接退出。
错误2:端口映射与配置不匹配
以kafka1为例:
你配置的KAFKA_ADVERTISED_LISTENERS中对外访问地址是PLAINTEXT_HOST://localhost:29092,但ports中只映射了9092:9092,既没有映射29092端口,也没有对应上内部监听的端口,kafka2存在同样的问题。
错误3:架构兼容性问题
如果你使用的是ARM架构的设备(比如苹果M系列芯片的Mac、ARM架构的云服务器),wurstmeister/zookeeper和wurstmeister/kafka镜像仅支持AMD64架构,启动后会直接崩溃退出。
第三步:修复方案
方案A:X86/AMD64架构设备修复后的docker-compose.yml
version: '3' services: zookeeper: image: wurstmeister/zookeeper container_name: zoom ports: - "2181:2181" restart: unless-stopped kafka1: image: wurstmeister/kafka container_name: kafkacont1 ports: - "9092:9092" - "29092:29092" environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 # 新增实际监听端口配置 KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:29092 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:9092,PLAINTEXT_HOST://localhost:29092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2 restart: unless-stopped depends_on: - zookeeper kafka2: image: wurstmeister/kafka container_name: kafkacont2 ports: - "9093:9093" - "39092:39092" environment: KAFKA_BROKER_ID: 2 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 # 新增实际监听端口配置 KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9093,PLAINTEXT_HOST://0.0.0.0:39092 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka2:9093,PLAINTEXT_HOST://localhost:39092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 2 restart: unless-stopped depends_on: - zookeeper
方案B:ARM架构设备修复方案
将镜像替换为兼容ARM架构的镜像,比如bitnami/zookeeper和bitnami/kafka即可,其余配置逻辑和上面一致。
第四步:验证步骤
- 删除之前创建的失败容器:
docker rm -f zoom kafkacont1 kafkacont2 - 重新执行启动命令:
docker-compose -f docker-compose.yml up -d - 等待10秒后执行
docker ps,即可看到三个容器都处于运行状态
内容的提问来源于stack exchange,提问作者Thejas
相关产品推荐
相关产品推荐

