You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:54:51