文章目录
- 一、单节点Docker 运行 Kafka 4.0+
- docker run 单机快速(测试用)
- docker‑compose 完整模板(单机KRaft,4.0.0)
- 进入容器测试命令
- SpringBoot application.yml 连接配置
- 重点注意事项
- 搭配kafka‑ui可视化(扩展compose片段)
- 二、Kafka4.0.x KRaft 三节点高可用集群(Docker Compose)
- docker‑compose.yml
- 启动步骤
- SpringBoot 连接配置
- 集群测试命令
- 关键特性说明
- 高频踩坑
- 停止&清理
一、单节点Docker 运行 Kafka 4.0+
Kafka 4.0彻底删除 Zookeeper 模式,只支持 KRaft,不再支持 zk。
官方镜像:apache/kafka,没有 zk 相关任何配置。
docker run 单机快速(测试用)
dockerrun-d\--namekafka4\--restartalways\-p9092:9092\-p9093:9093\-v/data/kafka4/kraft-data:/tmp/kraft-combined-logs\-eKAFKA_NODE_ID=1\-eKAFKA_PROCESS_ROLES=broker,controller\-eKAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093\-eKAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.100:9092\-eKAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER\-eKAFKA_CONTROLLER_QUORUM_VOTERS=1@kafka4:9093\-eKAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1\apache/kafka:4.0.0⚠️ 修改
192.168.1.100为你的宿主机真实IP,SpringBoot业务连接用这个IP:9092。
docker‑compose 完整模板(单机KRaft,4.0.0)
version:'3.8'services:kafka:image:apache/kafka:4.0.0container_name:kafka4restart:alwaysports:-"9092:9092"-"9093:9093"volumes:-./kraft-data:/tmp/kraft-combined-logsenvironment:KAFKA_NODE_ID:1KAFKA_PROCESS_ROLES:'broker,controller'KAFKA_LISTENERS:'PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093'KAFKA_ADVERTISED_LISTENERS:PLAINTEXT://192.168.1.100:9092KAFKA_CONTROLLER_LISTENER_NAMES:'CONTROLLER'KAFKA_CONTROLLER_QUORUM_VOTERS:'1@kafka:9093'KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR:1KAFKA_LOG_RETENTION_HOURS:72KAFKA_LOG_DIRS:'/tmp/kraft-combined-logs'启动
docker-composeup-d进入容器测试命令
# 进入容器dockerexec-itkafka4bash# 创建topickafka-topics.sh--create--topicdemo --bootstrap-server127.0.0.1:9092--partitions2--replication-factor1# 列表kafka-topics.sh--list--bootstrap-server127.0.0.1:9092# 生产者kafka-console-producer.sh--topicdemo --bootstrap-server127.0.0.1:9092# 消费者kafka-console-consumer.sh--topicdemo --bootstrap-server127.0.0.1:9092 --from-beginning# 查看kafka版本kafka-topics.sh--versionSpringBoot application.yml 连接配置
spring:kafka:bootstrap-servers:192.168.1.100:9092producer:key-serializer:org.apache.kafka.common.serialization.StringSerializervalue-serializer:org.apache.kafka.common.serialization.StringSerializerconsumer:key-deserializer:org.apache.kafka.common.serialization.StringDeserializervalue-deserializer:org.apache.kafka.common.serialization.StringDeserializer重点注意事项
- Kafka4.x 完全没有Zookeeper,不要再写任何zk连接参数。
- 镜像:
apache/kafka:4.0.0,不要用confluentinc/cp‑kafka,cp还没有4.0大版本。 - 数据目录权限:挂载宿主机目录报权限拒绝
chmod-R777./kraft-data- 升级提醒:旧的kafka3.x zookeeper集群不能直接升级到4.0。
- 3.x zk集群 → 先升级到3.5+/3.6+,执行迁移工具切换KRaft;迁移完成后,再升级到4.0。
- 不能直接把zk的数据目录直接给kafka4使用,元数据格式完全不一样。
- 单机生产注意:单机同时做broker+controller,
replication‑factor=1,不能高可用,仅测试/小规模使用;真正生产集群至少3节点controller。
搭配kafka‑ui可视化(扩展compose片段)
kafka-ui:image:provectuslabs/kafka-ui:latestcontainer_name:kafka-uirestart:alwaysports:-"8081:8080"environment:KAFKA_CLUSTERS_0_NAME:local‑kraft‑40KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS:kafka:9092访问:http://宿主机IP:8081
二、Kafka4.0.x KRaft 三节点高可用集群(Docker Compose)
Kafka4.0+彻底移除Zookeeper,仅KRaft模式
3个节点全部同时充当broker + controller,控制器仲裁quorum=3,挂掉任意1台集群依然正常工作,满足生产高可用基础条件。
注意:下面是单机docker模拟3节点集群(同一台宿主机),用于开发测试;真正生产要部署在三台不同物理服务器。
docker‑compose.yml
version:"3.8"services:kafka‑1:image:apache/kafka:4.0.0container_name:kafka‑1restart:alwaysports:-"9092:9092"# broker端口对外-"9093:9093"# controller内部仲裁端口volumes:-./data‑1:/tmp/kraft‑combined‑logsenvironment:KAFKA_NODE_ID:1KAFKA_PROCESS_ROLES:"broker,controller"KAFKA_LISTENERS:"PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093"# 👉 修改为你的宿主机IP,外部业务程序连接KAFKA_ADVERTISED_LISTENERS:"PLAINTEXT://192.168.1.100:9092"KAFKA_CONTROLLER_LISTENER_NAMES:"CONTROLLER"KAFKA_CONTROLLER_QUORUM_VOTERS:"1@kafka‑1:9093,2@kafka‑2:9093,3@kafka‑3:9093"KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR:3KAFKA_DEFAULT_REPLICATION_FACTOR:3KAFKA_LOG_DIRS:"/tmp/kraft‑combined‑logs"kafka‑2:image:apache/kafka:4.0.0container_name:kafka‑2restart:alwaysports:-"9094:9092"-"9095:9093"volumes:-./data‑2:/tmp/kraft‑combined‑logsenvironment:KAFKA_NODE_ID:2KAFKA_PROCESS_ROLES:"broker,controller"KAFKA_LISTENERS:"PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093"KAFKA_ADVERTISED_LISTENERS:"PLAINTEXT://192.168.1.100:9094"KAFKA_CONTROLLER_LISTENER_NAMES:"CONTROLLER"KAFKA_CONTROLLER_QUORUM_VOTERS:"1@kafka‑1:9093,2@kafka‑2:9093,3@kafka‑3:9093"KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR:3KAFKA_DEFAULT_REPLICATION_FACTOR:3KAFKA_LOG_DIRS:"/tmp/kraft‑combined‑logs"kafka‑3:image:apache/kafka:4.0.0container_name:kafka‑3restart:alwaysports:-"9096:9092"-"9097:9093"volumes:-./data‑3:/tmp/kraft‑combined‑logsenvironment:KAFKA_NODE_ID:3KAFKA_PROCESS_ROLES:"broker,controller"KAFKA_LISTENERS:"PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093"KAFKA_ADVERTISED_LISTENERS:"PLAINTEXT://192.168.1.100:9096"KAFKA_CONTROLLER_LISTENER_NAMES:"CONTROLLER"KAFKA_CONTROLLER_QUORUM_VOTERS:"1@kafka‑1:9093,2@kafka‑2:9093,3@kafka‑3:9093"KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR:3KAFKA_DEFAULT_REPLICATION_FACTOR:3KAFKA_LOG_DIRS:"/tmp/kraft‑combined‑logs"kafka-ui:image:provectuslabs/kafka-ui:latestcontainer_name:kafka-uirestart:alwaysports:-"8081:8080"environment:KAFKA_CLUSTERS_0_NAME:kafka4‑3node‑kraftKAFKA_CLUSTERS_0_BOOTSTRAPSERVERS:kafka‑1:9092,kafka‑2:9092,kafka‑3:9092启动步骤
# 创建数据目录mkdir-pdata‑1 data‑2 data‑3# 解决容器挂载目录权限问题chmod-R777data‑1 data‑2 data‑3# 启动集群docker-composeup-d# 查看容器状态docker-composeps访问UI:http://宿主机IP:8081
SpringBoot 连接配置
spring:kafka:bootstrap-servers:192.168.1.100:9092,192.168.1.100:9094,192.168.1.100:9096producer:key-serializer:org.apache.kafka.common.serialization.StringSerializervalue-serializer:org.apache.kafka.common.serialization.StringSerializerconsumer:key-deserializer:org.apache.kafka.common.serialization.StringDeserializervalue-deserializer:org.apache.kafka.common.serialization.StringDeserializer集群测试命令
# 进入kafka‑1容器dockerexec-itkafka‑1bash# 创建topic,3分区,3副本kafka-topics.sh--create--topictest3 --bootstrap-server127.0.0.1:9092--partitions3--replication-factor3# 查看topic详细信息kafka-topics.sh--describe--topictest3 --bootstrap-server127.0.0.1:9092# 查看集群版本kafka-topics.sh--version关键特性说明
- 3个controller节点,quorum=3,挂掉任意一台,集群控制器依然正常工作;挂2台控制器集群元数据不可用。
default.replication.factor=3,新建topic默认3副本。- 同一台宿主机docker模拟仅用于开发测试;真正生产三台物理服务器部署:
- 每台机器只跑一个kafka容器
KAFKA_CONTROLLER_QUORUM_VOTERS填写三台机器ip+controller端口KAFKA_ADVERTISED_LISTENERS填写各自机器外网/内网IP
高频踩坑
- KAFKA_ADVERTISED_LISTENERS:必须填写宿主机真实内网IP,不能写127.0.0.1,否则外部业务连接失败。
- 容器内部之间通信,使用容器名
kafka‑1:9093,不要用宿主机IP。 - 数据目录权限报错:
chmod -R 777 data‑*。 - replication‑factor不能大于broker节点数。
- 旧Zookeeper的kafka数据不能直接迁移到此集群,需要重新搭建或使用官方迁移工具。
停止&清理
# 停止集群docker-composedown# 彻底删除数据(测试重置集群用)rm-rfdata‑1 data‑2 data‑3mkdir-pdata‑1 data‑2 data‑3chmod-R777data‑1 data‑2 data‑3