当前位置: 首页 > news >正文

docker-compose 部署单节点 kafka 4.0 测试环境

高版本kafka已经不再需要ZooKeeper当保姆才能启动了,现在部署一个单机单节点测试环境比原来方便不少。

不过最常用的bitnami/kafka不再提供免费镜像,导致我们只能用apache/kafka,新镜像的配置会稍微麻烦一些,所以记录一下。

部署内容:

  • 单节点kafka服务,版本4.0+
  • kafka UI,方便管理,版本用最新的
  • 开启简单的用户名密码验证

docker-compose文件:

version: '3'networks:kafka-net:services:kafka:image: apache/kafka:latestcontainer_name: kafkanetworks:- kafka-netports:- "9092:9092"volumes:- ./kafka_data:/var/lib/kafka/data- ./kafka_server_jaas.conf:/etc/kafka/kafka_server_jaas.conf # 配置用户名密码environment:KAFKA_NODE_ID: 1KAFKA_PROCESS_ROLES: 'broker,controller'KAFKA_CONTROLLER_QUORUM_VOTERS: '1@localhost:9093'KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'# 定义监听器:EXTERNAL(9092) 走 SASL 认证,PLAINTEXT(29092) 给容器内用(这里也改为 SASL 确保安全)KAFKA_LISTENERS: 'SASL_PLAINTEXT://0.0.0.0:29092,EXTERNAL://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093'KAFKA_ADVERTISED_LISTENERS: 'SASL_PLAINTEXT://kafka:29092,EXTERNAL://localhost:9092'KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'CONTROLLER:PLAINTEXT,SASL_PLAINTEXT:SASL_PLAINTEXT,EXTERNAL:SASL_PLAINTEXT'KAFKA_INTER_BROKER_LISTENER_NAME: 'SASL_PLAINTEXT'# SASL/PLAIN 认证配置KAFKA_SASL_ENABLED_MECHANISMS: 'PLAIN'KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: 'PLAIN'# 告诉 Kafka 读取我们的 JAAS 文件KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/kafka/kafka_server_jaas.conf"# 数据持久化KAFKA_LOG_DIRS: '/var/lib/kafka/data'kafka-ui:image: provectuslabs/kafka-ui:latestcontainer_name: kafka-uidepends_on:- kafkanetworks:- kafka-netports:# 映射到8090,因为8080一般还得挂其他的服务做测试- "8090:8080"environment:KAFKA_CLUSTERS_0_NAME: localKAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:29092# 配置 UI 使用用户名和密码连接 KafkaKAFKA_CLUSTERS_0_PROPERTIES_SECURITY_PROTOCOL: SASL_PLAINTEXTKAFKA_CLUSTERS_0_PROPERTIES_SASL_MECHANISM: PLAINKAFKA_CLUSTERS_0_PROPERTIES_SASL_JAAS_CONFIG: 'org.apache.kafka.common.security.plain.PlainLoginModule required username="你配置的用户名" password="你配置的密码";'

配置文件里输入用户和密码:

KafkaServer {org.apache.kafka.common.security.plain.PlainLoginModule requiredusername="节点在集群内通信时的用户名"password="节点在集群内通信时的密码"# 下面这些才是用户配置# 格式user_<用户名>="密码"user_apot="你配置的密码";
};

创建好文件和目录之后用docker-compose up -d就能启动服务了。访问localhost:8090可以看到kafka的web控制面板:

image

安装好之后可以用下面的命令查看版本:

$ docker exec -it kafka /opt/kafka/bin/kafka-server-start.sh --version[2025-12-29 11:08:34,595] INFO Registered kafka:type=kafka.Log4jController MBean (kafka.utils.Log4jControllerRegistration$)
4.0.0

可以看到已经配置好了kafka 4.0环境。

apache/kafka的镜像里内置了各种操作kafka的脚本,不过这些脚本没被添加进$PATH,执行的时候需要指定路径:

# 先配置登录验证信息
docker exec -it kafka bash -c "cat <<EOF > /tmp/client.conf
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \username='客户端登录用户名,就是我们之前用user_xxx配置的那些' \password='客户端登录密码';
EOF"# 调用脚本创建一个topic,需要指定脚本路径
docker exec -it kafka /opt/kafka/bin/kafka-topics.sh --command-config /tmp/client.conf \--bootstrap-server localhost:9092 \--create \--topic test.data \--partitions 1 \--replication-factor 1 \--config cleanup.policy=delete \--config retention.ms=86400000

所有脚本都存放在/opt/kafka/bin路径下,调用前还需要提供登录凭证信息,这些需要注意。打开localhost:8090上的web UI,就能找到我们刚刚创建的topic了:

image

分区和过期时间也已经被正确设置:

image

总体而言执行脚本还是有些繁琐,我更愿意通过代码或者web界面来做这些操作。

最后我们写一个go的测试代码,向我们的测试用单节点kafka里写入一些数据:

package mainimport ("context""math/rand/v2""strconv""time""github.com/segmentio/kafka-go""github.com/segmentio/kafka-go/sasl/plain"
)const (topic         = "lean.data1"kafkaEndpoint = "localhost:9092"
)func main() {mechanism := plain.Mechanism{Username: "客户端登录用户名",Password: "客户端登录密码",}dialer := &kafka.Dialer{Timeout:       10 * time.Second,DualStack:     true,SASLMechanism: mechanism,}w := kafka.NewWriter(kafka.WriterConfig{Brokers: []string{kafkaEndpoint},Dialer:  dialer, // 必须传入带 SASL 的 dialerAsync:   false,})defer w.Close()msg := kafka.Message{Topic: topic,Key:   []byte("test"),Value: []byte(strconv.Itoa(rand.Int())), // 随便写入一些随机数据}ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)defer cancel()err := w.WriteMessages(ctx, msg)if err != nil {panic(err)}
}

image

可以看到我们的随机数已经正常写入topic了。

注意:这个配置只使用了最基本的验证,且是单节点,不适合在测试和学习之外的任何用途使用,为了安全我也建议在测试完成之后就立刻用docker-compose down关闭服务。

http://www.jsqmd.com/news/161415/

相关文章:

  • 将PyTorch模型从实验推向生产:部署全流程解析
  • 【课程设计/毕业设计】基于SpringBoot的食堂管理系统基于SpringBoot的高校餐饮档口管理系统的设计与实现【附源码、数据库、万字文档】
  • 【课程设计/毕业设计】基于SpringBoot高校智慧党建管理系统的设计与实现基于springBoot的高校大学生党建系统设计与实现【附源码、数据库、万字文档】
  • 2025年终证券开户券商推荐:综合实力与客户满意度双维度实测TOP5排名。 - 品牌推荐
  • Java计算机毕设之基于java+springboot+vue电影推荐系统设计与实现springboot+vue影视推荐系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 如何获取Walter Rudin经典数学教材:实分析与复分析完整PDF版
  • 102301210-郑烨的软件工程学期总结
  • 6款AI论文神器实测:效率飙升100%,轻松告别拖延症! - 麟书学长
  • Docker镜像源推荐:PyTorch-CUDA-v2.7一键拉取与部署
  • 2025年终证券开户券商推荐:从产业投行到财富管理的5家高价值券商盘点。 - 品牌推荐
  • Java计算机毕设之基于SpringBoot的高校餐饮档口管理系统的设计与实现基于SpringBoot的大学食堂管理系统的设计和实现(完整前后端代码+说明文档+LW,调试定制等)
  • 2025年终手机炒股券商推荐:交易体验与投顾服务双维度实测TOP5排名。 - 品牌推荐
  • 2025年AI大模型学习路线图:从零基础到专家的完整指南_AI大模型学习路线(非常详细)收藏这一篇就够了!
  • CF1047C Region Separation - Link
  • PyTorch-CUDA-v2.7镜像中举办黑客松活动推广平台使用
  • 2025年终手机炒股券商推荐:聚焦智能工具与服务的5强深度解析 - 品牌推荐
  • Java毕设选题推荐:基于springboot+vue影视推荐系统的设计与实现电影推荐系统设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 对比测试:手动安装PyTorch vs 使用PyTorch-CUDA-v2.7镜像
  • PyTorch-CUDA-v2.7镜像跑Stable Diffusion效果如何
  • PyTorch-CUDA-v2.7镜像中对比传统‘pytorch安装’方式的十大优势
  • Java毕设项目:基于springboot+vue影视推荐系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • Java毕设项目:基于SpringBoot的高校餐饮档口管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 2025年终证券开户券商推荐:不同投资需求下的券商选择指南与排名。 - 品牌推荐
  • 技术人文与企业价值观如何融合
  • PyTorch-CUDA-v2.7镜像预装了哪些常用库?pip list一览
  • JS删除数组里的某个元素方法
  • AI智能体协作提升财务报表分析的准确性和效率
  • CF1047虚拟赛总结 - Link
  • PyTorch-CUDA-v2.7镜像中评估推理延迟影响因素
  • 无需重复造轮子:直接使用PyTorch-CUDA-v2.7基础镜像