1、首先安装docker compose
sudo apt install docker-compose
2、创建/app/kafka-kraft/data目录用于映射kafka数据目录
mkdir -p -m 777 /app/kafka-kraft/data
3、创建docker-compose.yml 并修改如下配置
version: '3.3'
services:
kafka:
image: bitnami/kafka:3.4 # 使用Bitnami提供的Kafka 3.4镜像,已内置KRaft支持
container_name: kafka-kraft
restart: unless-stopped # 容器异常退出时自动重启
hostname: kafka # 固定主机名,确保Kafka UI能通过容器名解析到服务
ports:
- "9092:9092" # 内部通信
- "9093:9093" # KRaft控制器通信
- "9094:9094" # 外部访问端口
environment:
# JVM堆内存配置(根据业务需求调整)
- KAFKA_HEAP_OPTS=-Xms512M -Xmx1G
# KRaft模式核心配置[3,5](@ref)
- KAFKA_ENABLE_KRAFT=yes # 启用KRaft模式(替代ZooKeeper)
- KAFKA_CFG_PROCESS_ROLES=broker,controller # 节点同时承担Broker和Controller角色
- KAFKA_CFG_NODE_ID=1 # 节点唯一ID(集群中需唯一)
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka:9093 # 单节点选举配置(格式:id@host:port)
# 监听器配置[3,6](@ref)
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094 # 定义三类监听器
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://192.168.0.186:9094 # 客户端访问地址(容器内通信需用容器名)
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,EXTERNAL:PLAINTEXT # 安全协议映射
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER # 指定Controller监听器名称
- KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT # 指定Broker间通信使用的监听器名称
- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false # 生产环境建议关闭自动创建Topic
volumes:
- /app/kafka-kraft/data:/bitnami/kafka/data # 数据持久化(避免容器重启丢失)
networks:
- kafka-net # 加入自定义网络,确保容器间互通
kafka-ui:
image: provectuslabs/kafka-ui:latest # 轻量级Kafka管理UI
container_name: kafka-ui
depends_on:
- kafka # 依赖Kafka服务先启动
ports:
- "19092:8080" # 暴露UI访问端口(浏览器访问http://localhost:19092)
environment:
- AUTH_TYPE=LOGIN_FORM # 启用表单登录认证
- SPRING_SECURITY_USER_NAME=admin # 管理员用户名
- SPRING_SECURITY_USER_PASSWORD=admin # 管理员密码
# 集群配置(支持多集群,此处配置一个)[6,7](@ref)
- KAFKA_CLUSTERS_0_NAME=kraft-cluster # 集群显示名称
- KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS=kafka:9092 # 使用Kafka容器名+内部端口(必须与Kafka的advertised.listeners一致)
- DYNAMIC_CONFIG_ENABLED=true # 允许通过UI动态修改配置(如添加Topic)
networks:
- kafka-net # 与Kafka共享网络
networks:
kafka-net:
driver: bridge # 创建桥接网络,隔离容器间通信
注意:
KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://192.168.0.186:9094 # 客户端访问地址(容器内通信需用容器名)
这里PLAINTEXT://kafka:9092 是内部容器通过kafka别名进行的通信,EXTERNAL://192.168.0.186:9094是外部通过ip进行访问的通信
4、执行命令
sudo docker-compose up -d
5、可视化访问
http://宿主机ip:19092 账号密码上方有配置:admin