前置条件
- 已安装Docker Desktop(Windows/macOS 通用,Windows 建议启用 WSL2 后端)
- 基础的 C++ 编译环境(Windows 用 WSL2 Ubuntu,macOS 用 Xcode,Linux 直接用系统编译器)
- 网络正常(能拉取 Docker 镜像)
第一步:搭建 Kafka 集群(3 节点 + ZooKeeper)
1.1 新建集群目录
在电脑任意位置新建文件夹(比如 D:\kafka-cluster 或 /home/kafka-cluster),后续所有操作都在这个目录下进行。
1.2 编写 docker-compose.yml 文件
在该目录下新建文件 docker-compose.yml,复制粘贴以下内容(注释已写清楚,不用改):
version: '3.8'
services:
# ZooKeeper(Kafka <=2.8依赖,集群协调)
zookeeper:
image: confluentinc/cp-zookeeper:7.4.0
container_name: zookeeper
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
networks:
- kafka-network
# Kafka节点1
kafka1:
image: confluentinc/cp-kafka:7.4.0
container_name: kafka1
depends_on:
- zookeeper
ports:
- "9092:9092" # 宿主机访问端口
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
# 关键:配置外部可访问的地址(host.docker.internal是Docker宿主机的别名)
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://host.docker.internal:9092,PLAINTEXT_INTERNAL://kafka1:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_INTERNAL:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT_INTERNAL
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3 # 偏移量主题副本数(集群至少3节点)
networks:
- kafka-network
# Kafka节点2
kafka2:
image: confluentinc/cp-kafka:7.4.0
container_name: kafka2
depends_on:
- zookeeper
ports:
- "9093:9093"
environment:
KAFKA_BROKER_ID: 2
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://host.docker.internal:9093,PLAINTEXT_INTERNAL://kafka2:29093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_INTERNAL:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT_INTERNAL
networks:
- kafka-network
# Kafka节点3
kafka3:
image: confluentinc/cp-kafka:7.4.0
container_name: kafka3
depends_on:
- zookeeper
ports:
- "9094:9094"
environment:
KAFKA_BROKER_ID: 3
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://host.docker.internal:9094,PLAINTEXT_INTERNAL://kafka3:29094
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_INTERNAL:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT_INTERNAL
networks:
- kafka-network
# 自定义网络(集群内容器互通)
networks:
kafka-network:
driver: bridge
1.3 启动 Kafka 集群
-
打开终端(Windows 用 PowerShell/CMD,macOS/Linux 用终端),进入
kafka-cluster目录:# Windows示例 cd D:\kafka-cluster # macOS/Linux示例 cd /home/kafka-cluster -
启动集群(后台运行):
docker-compose up -d -
检查容器状态(正常应该都是
Up):docker-compose ps输出示例:
NAME COMMAND SERVICE STATUS PORTS kafka1 "/etc/confluent/dock..." kafka1 running 0.0.0.0:9092->9092/tcp kafka2 "/etc/confluent/dock..." kafka2 running 0.0.0.0:9093->9093/tcp kafka3 "/etc/confluent/dock..." kafka3 running 0.0.0.0:9094->9094/tcp zookeeper "/etc/confluent/dock..." zookeeper running 0.0.0.0:2181->2181/tcp
1.4 验证集群是否正常
-
进入 kafka1 容器,创建测试主题(副本数 3,分区数 3,适配集群):
docker exec -it kafka1 /bin/bash -
在容器内执行创建主题命令:
kafka-topics --create --topic test_topic --bootstrap-server kafka1:29092,kafka2:29092,kafka3:29092 --partitions 3 --replication-factor 3 -
查看主题信息(验证集群节点):
kafka-topics --describe --topic test_topic --bootstrap-server kafka1:29092输出示例(能看到 3 个副本分布在 3 个节点):
Topic: test_topic TopicId: xxxxx PartitionCount: 3 ReplicationFactor: 3 Configs: Topic: test_topic Partition: 0 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3 Topic: test_topic Partition: 1 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1 Topic: test_topic Partition: 2 Leader: 3 Replicas: 3,1,2 Isr: 3,1,2 -
退出容器:
exit