docker搭建Kafka集群
  基于已有的三台物理机(10.143.143.101-103)和ZooKeeper集群,以下是通过Docker搭建Kafka集群的完整方案:
# 一、部署架构设计
节点分配
- 每台物理机部署一个Kafka Broker容器,组成3节点集群。
 - 使用
host网络模式(性能最佳)或bridge模式(需端口映射)。 - ZooKeeper集群复用现有环境,无需额外部署。
 
关键配置原则
KAFKA_BROKER_ID:每台机器唯一(如101/102/103)。KAFKA_ADVERTISED_LISTENERS:必须设置为宿主机的真实IP(否则外部客户端无法连接)。KAFKA_ZOOKEEPER_CONNECT:指向现有ZooKeeper集群地址(如zk1:2181,zk2:2181,zk3:2181)。
# 二、单台机器部署步骤(以10.143.143.101为例)
# 1. 拉取镜像
docker pull wurstmeister/kafka
 1
# 2. 启动Kafka容器
docker run -d --name kafka101 \
  --network host \  # 推荐host模式避免端口映射问题
  -e KAFKA_BROKER_ID=101 \  # 与宿主机末三位一致
  -e KAFKA_ZOOKEEPER_CONNECT=10.143.143.101:2181,10.143.143.102:2181,10.143.143.103:2181 \  # 替换为实际ZK地址
  -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://10.143.143.101:9092 \  # 当前宿主机IP
  -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \  # 容器内监听所有IP
  -e KAFKA_LOG_DIRS=/kafka/logs \  # 日志目录
  -v /data/kafka/logs:/kafka/logs \  # 挂载日志目录持久化
  wurstmeister/kafka
 1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
参数说明:
KAFKA_BROKER_ID:集群内唯一标识(102/103机器分别设为102/103)。KAFKA_ADVERTISED_LISTENERS:客户端使用的通信地址,必须为物理机IP。- 若ZooKeeper使用非2181端口,需调整连接字符串。
 
# 3. 重复操作
在102、103机器执行相同命令,仅修改以下参数:
--name kafka102/kafka103KAFKA_BROKER_ID=102/103KAFKA_ADVERTISED_LISTENERS中的IP为当前宿主机IP。
# 三、集群验证
# 1. 创建测试Topic
进入任意容器执行:
docker exec -it kafka101 sh
cd /opt/kafka/bin
# 创建Topic(3分区、3副本)
./kafka-topics.sh --create \
  --bootstrap-server 10.143.143.101:9092 \
  --replication-factor 3 \
  --partitions 3 \
  --topic test
 1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 2. 查看Topic状态
./kafka-topics.sh --describe \
  --bootstrap-server 10.143.143.101:9092 \
  --topic test
 1
2
3
2
3
预期输出:
Partition信息显示3个分区均匀分布在101/102/103节点。Replicas显示每个分区有3个副本。
# 3. 生产消费测试
- 生产者(10.143.143.101):
./kafka-console-producer.sh \ --broker-list 10.143.143.101:9092,10.143.143.102:9092,10.143.143.103:9092 \ --topic test1
2
3 - 消费者(10.143.143.102):若生产者输入消息后消费者能实时接收,则集群工作正常。
./kafka-console-consumer.sh \ --bootstrap-server 10.143.143.101:9092,10.143.143.102:9092,10.143.143.103:9092 \ --topic test \ --from-beginning1
2
3
4 
# 四、运维优化建议
数据持久化
挂载宿主机目录存储日志(如-v /data/kafka:/kafka),避免容器重启数据丢失。资源限制
启动时添加--memory=2g --cpus=2限制容器资源,防止单节点过载。监控方案
- Kafka Manager:通过Docker部署可视化管控平台:
kafka-manager: image: sheepkiller/kafka-manager ports: ["9000:9000"] environment: ZK_HOSTS: "10.143.143.101:2181,10.143.143.102:2181,10.143.143.103:2181"1
2
3
4
5 
- Kafka Manager:通过Docker部署可视化管控平台:
 安全加固
- 生产环境启用SASL认证(参考的
KAFKA_CFG_SASL_ENABLED_MECHANISMS)。 - 限制ZooKeeper访问IP(如防火墙规则)。
 
- 生产环境启用SASL认证(参考的
 
# 常见问题解决
- Broker无法注册到ZooKeeper:
检查KAFKA_ZOOKEEPER_CONNECT地址是否正确、网络是否互通。 - 客户端连接超时:
确认KAFKA_ADVERTISED_LISTENERS设置为物理机IP(非localhost)。 - 数据未持久化:
挂载目录后需确保容器用户有写权限(可添加--user root临时解决)。 
部署完成后,建议通过
kafka-consumer-groups.sh验证集群负载均衡状态。如需更简化的管理,可改用Docker Compose编排(参考的yml模板)。
编辑  (opens new window)
  上次更新: 2025/06/24, 00:41:57