Windows11下Docker Compose创建Kafka Topic失败及解决方法
用Docker Compose创建Kafka Topic失败(Bitnami镜像)的原因及修复
你最初的Bitnami版docker-compose.yml确实存在配置错误和缺失,导致init-kafka容器无法连接Kafka broker完成Topic创建,具体问题如下:
1. 广告监听地址配置错误
你设置了KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://127.0.0.1:9092,但在Docker网络环境中,127.0.0.1指向init-kafka容器自身,而非kafka_1容器。当init-kafka尝试通过kafka_1:9092连接broker时,broker返回的是127.0.0.1:9092,init-kafka会尝试连接自己的9092端口,自然无法成功。
正确做法是为Kafka配置内部+外部双监听:
- 内部监听供Docker网络内的容器访问(用容器名
kafka_1) - 外部监听供宿主机访问(用
localhost)
需要补充以下环境变量:
KAFKA_LISTENERS=PLAINTEXT://:9092,PLAINTEXT_HOST://:9093 KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka_1:9092,PLAINTEXT_HOST://localhost:9093 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT
同时将kafka_1的端口映射改为- '9093:9093'(对应外部监听端口)。
2. 缺少Kafka服务就绪等待逻辑
depends_on: - kafka_1仅保证kafka_1容器先启动,但不保证Kafka服务完全初始化完成。init-kafka容器启动后立即执行创建Topic命令,此时Kafka可能还未就绪,直接导致超时。
需要在init-kafka的命令中添加等待逻辑,循环检查Kafka是否可连接:
command: | bash -c " until kafka-topics.sh --bootstrap-server kafka_1:9092 --list; do echo 'Waiting for Kafka to be ready...' sleep 5 done kafka-topics.sh --create --if-not-exists --topic foo --replication-factor=1 --partitions=3 --bootstrap-server kafka_1:9092 "
3. 不必要的user: root配置
Bitnami的Kafka镜像默认用专用用户运行,强制设置user: root可能导致挂载目录权限异常,除非你明确需要root权限,否则建议移除该配置。
修正后的Bitnami版docker-compose.yml示例
version: '3.9' networks: myNetwork: services: zookeeper: image: 'bitnami/zookeeper:latest' ports: - '2181:2181' environment: - ALLOW_ANONYMOUS_LOGIN=yes networks: - myNetwork kafka_1: image: 'bitnami/kafka:latest' ports: - '9093:9093' environment: - KAFKA_BROKER_ID=1 - KAFKA_LISTENERS=PLAINTEXT://:9092,PLAINTEXT_HOST://:9093 - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka_1:9092,PLAINTEXT_HOST://localhost:9093 - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT - KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 - ALLOW_PLAINTEXT_LISTENER=yes volumes: - ./Kafka:/bitnami/kafka networks: - myNetwork depends_on: - zookeeper init-kafka: image: 'bitnami/kafka:latest' depends_on: - kafka_1 working_dir: /opt/bitnami/kafka/bin entrypoint: /bin/bash networks: - myNetwork command: | -c " until kafka-topics.sh --bootstrap-server kafka_1:9092 --list; do echo 'Waiting for Kafka to be ready...' sleep 5 done kafka-topics.sh --create --if-not-exists --topic foo --replication-factor=1 --partitions=3 --bootstrap-server kafka_1:9092 "
你换成Confluent镜像后能成功的核心原因:
- 正确配置了内部监听(
PLAINTEXT://kafka_2:9092)和外部监听(PLAINTEXT_HOST://localhost:9093),Docker网络内的init-kafka容器能通过容器名正常访问Kafka broker init-kafka的命令中添加了kafka-topics --bootstrap-server kafka_2:9092 --list的等待逻辑,确保Kafka就绪后再执行创建Topic操作
内容的提问来源于stack exchange,提问作者lm.
相关产品推荐
相关产品推荐

