一、docker compose
Kafka 单机docker-compose.yml
:
version: "3.8"
services:
kafka:
image: bitnami/kafka:4.0.0
container_name: kafka
ports:
- "9092:9092"
environment:
- KAFKA_ENABLE_KRAFT=yes
- KAFKA_KRAFT_CLUSTER_ID=4L6g3nShT-eMCtK--X86sw
- KAFKA_CFG_NODE_ID=1
- KAFKA_CFG_PROCESS_ROLES=broker,controller
- KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://:9093
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.10.200:9092
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka:9093
- KAFKA_CFG_LOG_DIRS=/bitnami/kafka/data
volumes:
- kafka-data:/bitnami/kafka
volumes:
kafka-data:
启动:
docker compose up -d
docker compose logs -f kafka
version
: "3.8": 使用 Compose 文件规范 3.8 版本。services
: 定义要运行的服务集合。kafka
: 服务名(同时也是默认的内部 DNS 名称)。image: bitnami/kafka:4.0.0
: 使用 Bitnami 的 Kafka 4.0.0 镜像(KRaft 模式支持)。container_name: kafka
: 指定容器名为 kafka(便于管理)。ports: "9092:9092"
: 将宿主机 9092 暴露到容器 9092(客户端用 9092 连接 Kafka)。未暴露 9093,因为控制面只在容器网络内通信。environment
: Kafka 配置(通过环境变量注入)KAFKA_ENABLE_KRAFT=yes
: 启用 KRaft 模式(不使用 Zookeeper)。KAFKA_KRAFT_CLUSTER_ID=...
: KRaft 集群 ID,需固定不变(初始化生成一次即可复用)。KAFKA_CFG_NODE_ID=1
: 当前节点 ID(单节点可为 1)。KAFKA_CFG_PROCESS_ROLES=broker,controller
: 同一进程同时扮演 broker 与 controller。KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://:9093
: 定义监听端口PLAINTEXT://0.0.0.0:9092
:客户端监听在所有网卡 9092。CONTROLLER://:9093
:控制面监听在 9093(对容器网络可见)。KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://192.168.10.200:9092
: 对客户端“宣告”的地址,客户端拿到元数据后按此地址回连;需填宿主机可达的 IP/域名与端口。KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
: 将自定义监听名映射到安全协议(此处均为明文,无 TLS/SASL)。KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
: 控制面使用名为 CONTROLLER 的监听器。KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka:9093
: KRaft 控制器投票者列表(节点 ID@地址);单节点为 1@kafka:9093,其中 kafka 为 Compose 内部主机名。KAFKA_CFG_LOG_DIRS=/bitnami/kafka/data
: Kafka 数据目录(分区/段文件等)在容器内的路径。volumes: kafka-data:/bitnami/kafka
: 将命名卷 kafka-data 挂载到容器路径 /bitnami/kafka,持久化数据与配置。volumes: kafka-data
: 定义命名卷 kafka-data(使用默认本地驱动)。
补充要点:
外部客户端应使用bootstrap.servers=192.168.10.200:9092
。
确认宿主机防火墙放行 TCP 9092;若 IP/域名变更,记得同步更新KAFKA_CFG_ADVERTISED_LISTENERS
。
二、docker run(Kafka 单容器)
docker run -d --name kafka \
-p 9092:9092 \
-e KAFKA_ENABLE_KRAFT=yes \
-e KAFKA_KRAFT_CLUSTER_ID=4L6g3nShT-eMCtK--X86sw \
-e KAFKA_CFG_NODE_ID=1 \
-e KAFKA_CFG_PROCESS_ROLES=broker,controller \
-e KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \
-e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \
-e KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER \
-e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@127.0.0.1:9093 \
-e KAFKA_CFG_LOG_DIRS=/bitnami/kafka/data \
-v kafka-data:/bitnami/kafka \
bitnami/kafka:4.0.0
创建主题:
docker exec -it kafka /opt/bitnami/kafka/bin/kafka-topics.sh \
--create --topic test --bootstrap-server localhost:9092 \
--replication-factor 1 --partitions 1
生产者:
docker exec -it kafka /opt/bitnami/kafka/bin/kafka-console-producer.sh \
--bootstrap-server localhost:9092 --topic test
消费者:
docker exec -it kafka /opt/bitnami/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server localhost:9092 --topic test --from-beginning
列出主题:
docker exec -it kafka /opt/bitnami/kafka/bin/kafka-topics.sh \
--bootstrap-server localhost:9092 --list
评论