保姆级教程Docker部署KRaft模式的Kafka官方镜像

目录

一、安装Docker及可视化工具

二、单节点部署

1、创建挂载目录

2、运行Kafka容器

3、Compose运行Kafka容器

4、查看Kafka运行状态

三、集群部署

四、部署可视化工具

1、创建挂载目录

2、运行Kafka-ui容器

3、Compose运行Kafka-ui容器

4、查看Kafka-ui运行状态


在Kafka2.8版本之前,Kafka是强依赖于Zookeeper中间件的,这本身就很不合理,中间件依赖另一个中间件,搭建起来实在麻烦。所幸Kafka2.8之后推出了KRaft模式,即抛弃Zookeeper由Kafka节点自己做Controller来选举Leader。本篇文章内容就是介绍如何在Docker中搭建Kafka KRaft环境。

一、安装Docker及可视化工具

Docker及可视化工具的安装可参考:Ubuntu上安装 Docker及可视化管理工具

二、单节点部署

在进行单节点部署并以KRaft模式运行时,该节点通常是混合节点的类型

1、创建挂载目录

# 创建宿主机kafka挂载目录
sudo mkdir -p /data/docker/kafka

2、运行Kafka容器

# 拉取镜像
sudo docker pull apache/kafka:3.9.0
 
# 运行容器
sudo docker run --privileged=true \
--net=bridge \
-d --name=kafka \
-v /data/docker/kafka/data:/var/lib/kafka/data \
-v /data/docker/kafka/config:/mnt/shared/config \
-v /data/docker/kafka/secrets:/etc/kafka/secrets \
-p 9092:9092 -p 9093:9093 \
-e LANG=C.UTF-8 \
-e KAFKA_NODE_ID=1 \
-e CLUSTER_ID=kafka-cluster \
-e KAFKA_PROCESS_ROLES=broker,controller \
-e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT \
-e KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER \
-e KAFKA_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.3.9:9092 \
-e KAFKA_CONTROLLER_QUORUM_VOTERS=1@localhost:9093 \
apache/kafka:3.9.0

参数解析如下:

参数参数说明
docker run运行 Docker 容器
-d容器将在后台运行,而不是占用当前的终端会话
--privileged=trueDocker会赋予容器几乎与宿主机相同的权限
--net=bridge网络模式配置,默认是bridge,bridge表示使用容器内部配置网络
--name kafka给容器命名为 kafka,以便于管理和引用该容器
-p 9092:9092 -p 9093:9093映射 kafka 的客户端通信端口和控制器端口
-e KAFKA_NODE_ID=1节点ID,用于标识每个集群中的节点,需要是不小于1的整数,同一个集群中的节点ID不可重复
-e CLUSTER_ID=kafka-cluster集群ID,可以自定义任何字符串作为集群ID,同一个集群中所有节点的集群ID必须配置为一样
-e KAFKA_PROCESS_ROLES=broker,controller节点类型,broker,controller表示该节点是混合节点,通常单机部署时需要配置为混合节点

-e KAFKA_INTER_BROKER_LISTENER_NAME=

PLAINTEXT

Kafka的Broker地址前缀名称,固定为PLAINTEXT即可

-e KAFKA_CONTROLLER_LISTENER_NAMES=

CONTROLLER

Kafka的Controller地址前缀名称,固定为CONTROLLER即可

-e KAFKA_LISTENERS=

PLAINTEXT://:9092,CONTROLLER://:9093

表示Kafka要监听哪些端口,PLAINTEXT://:9092,CONTROLLER://:9093表示本节点作为混合节点,监听本机所有可用网卡的9092和9093端口,其中9092作为客户端通信端口,9093作为控制器端口

-e KAFKA_ADVERTISED_LISTENERS=

PLAINTEXT://192.168.3.9:9092

配置Kafka的外网地址,需要是PLAINTEXT://外网地址:端口的形式,当客户端连接Kafka服务端时,Kafka会将这个外网地址广播给客户端,然后客户端再通过这个外网地址连接,除此之外集群之间交换数据时也是通过这个配置项得到集群中每个节点的地址的,这样集群中节点才能进行交互。需要修改为对应的Kafka的外网地址。

-e KAFKA_CONTROLLER_QUORUM_VOTERS=

1@localhost:9093

投票节点列表,通常配置为集群中所有的Controller节点,格式为节点id@节点外网地址:节点Controller端口,多个节点使用逗号,隔开,由于是混合节点,因此配置自己就行了
-v /data/docker/kafka/data:/var/lib/kafka/data持久化数据文件夹,如果运行出现问题可以清空该数据卷文件重启再试
-v /data/docker/kafka/config:/mnt/shared/config持久化配置文件目录
-v /data/docker/kafka/secrets:/etc/kafka/secrets持久化秘钥相关文件夹

容器运行参数详解参考:Docker容器运行常用参数详解-CSDN博客 

3、Compose运行Kafka容器

创建docker-compose.yml文件

sudo touch /data/docker/kafka/docker-compose.yml

文件内容如下:

version: '3'
 
services:
  kafka:
    image: apache/kafka:3.9.0
    container_name: kafka
    ports:
      - "9092:9092"
      - "9093:9093"
    environment:
      - LANG=C.UTF-8
      - KAFKA_NODE_ID=1
      - CLUSTER_ID=kafka-cluster
      - KAFKA_PROCESS_ROLES=broker,controller
      - KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT
      - KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER
      - KAFKA_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.3.9:9092
      - KAFKA_CONTROLLER_QUORUM_VOTERS=1@localhost:9093
    volumes:
      - /data/docker/kafka/data:/var/lib/kafka/data
      - /data/docker/kafka/config:/mnt/shared/config
      - /data/docker/kafka/secrets:/etc/kafka/secrets
    privileged: true
    network_mode: "bridge"

运行容器

#-f:调用文件,-d:开启守护进程
sudo docker compose -f /data/docker/kafka/docker-compose.yml up -d

4、查看Kafka运行状态

三、集群部署

采用Broker + Controller集群,这是推荐的生产环境的集群部署方式,集群中不存在混合节点,每个节点要么是Broker类型,要么是Controller类型。

通过下列命令在服务器上部署:

# 定义域名
# 这是fish shell的变量定义语法
# 使用bash请替换为:kafka_host="192.168.3.9"
set kafka_host "192.168.3.9"

# 节点1-Controller
sudo docker run -id --privileged=true \
    --net=bridge --name=kafka-1 \
	-p 10001:9093 \
	-v /data/docker/kafka-1/config:/mnt/shared/config \
	-v /data/docker/kafka-1/data:/var/lib/kafka/data \
	-v /data/docker/kafka-1/secrets:/etc/kafka/secrets \
	-e LANG=C.UTF-8 \
	-e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT \
	-e KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER \
	-e CLUSTER_ID=kafka-cluster \
	-e KAFKA_NODE_ID=1 \
	-e KAFKA_PROCESS_ROLES=controller \
	-e KAFKA_CONTROLLER_QUORUM_VOTERS="1@$kafka_host:10001" \
	-e KAFKA_LISTENERS="CONTROLLER://:9093" \
	apache/kafka:3.9.0

# 节点2-Broker
sudo docker run -id --privileged=true \
    --net=bridge --name=kafka-2 \
	-p 9002:9092 \
	-v /data/docker/kafka-2/config:/mnt/shared/config \
	-v /data/docker/kafka-2/data:/var/lib/kafka/data \
	-v /data/docker/kafka-2/secrets:/etc/kafka/secrets \
	-e LANG=C.UTF-8 \
	-e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT \
	-e KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER \
	-e CLUSTER_ID=kafka-cluster \
	-e KAFKA_NODE_ID=2 \
	-e KAFKA_PROCESS_ROLES=broker \
	-e KAFKA_CONTROLLER_QUORUM_VOTERS="1@$kafka_host:10001" \
	-e KAFKA_LISTENERS="PLAINTEXT://:9092" \
	-e KAFKA_ADVERTISED_LISTENERS="PLAINTEXT://$kafka_host:9002" \
	apache/kafka:3.9.0

# 节点3-Broker
sudo docker run -id --privileged=true \
    --net=bridge --name=kafka-3 \
	-p 9003:9092 \
    -v /data/docker/kafka-3/config:/mnt/shared/config \
	-v /data/docker/kafka-3/data:/var/lib/kafka/data \
	-v /data/docker/kafka-3/secrets:/etc/kafka/secrets \
	-e LANG=C.UTF-8 \
	-e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT \
	-e KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER \
	-e CLUSTER_ID=kafka-cluster \
	-e KAFKA_NODE_ID=3 \
	-e KAFKA_PROCESS_ROLES=broker \
	-e KAFKA_CONTROLLER_QUORUM_VOTERS="1@$kafka_host:10001" \
	-e KAFKA_LISTENERS="PLAINTEXT://:9092" \
	-e KAFKA_ADVERTISED_LISTENERS="PLAINTEXT://$kafka_host:9003" \
	apache/kafka:3.9.0

这样,我们就部署了一个由1个Controller节点和2个Broker节点构成的集群,需要注意的是:

  • Broker节点无需暴露9093端口,Controller节点无需暴露9092端口
  • Broker节点需指定KAFKA_PROCESS_ROLES为broker,同样的Controller需要指定为controller
  • KAFKA_CONTROLLER_QUORUM_VOTERS配置只需要写集群中所有的Controller节点的地址端口列表
  • 对于KAFKA_LISTENERS配置项:Broker节点需要配置为PLAINTEXT://:9092,表示本节点作为Broker节点;Controller节点需要配置为CONTROLLER://:9093,表示本节点作为Controller节点
  • 对于KAFKA_ADVERTISED_LISTENERS配置项:Controller节点不能指定该配置;Broker节点需要指定为自己的外网地址和端口

四、部署可视化工具

在早期使用Kafka时,通常会选择Kafka Tool或Kafka Eagle进行管理。Kafka Tool是一款桌面应用程序,而Kafka Eagle则基于浏览器运行。尽管这两款工具在用户体验上表现平平,但它们基本能满足日常需求。

然而,自Kafka 3.3.1版本起,Kafka正式弃用了Zookeeper,转而采用自有的仲裁机制,即kraft模式。遗憾的是,上述两款工具似乎未能及时跟进这一更新,仍然要求用户输入Zookeeper地址才能连接,导致它们在新版本Kafka中无法正常使用。为了解决这一问题,我发现了一款轻量且易于使用的替代工具——kafka-ui,它能够更好地适配新版Kafka。

1、创建挂载目录

# 创建宿主机kafka-ui挂载目录
sudo mkdir -p /data/docker/kafka-ui/config

# 创建挂载的配置文件
sudo touch /data/docker/kafka-ui/config/dynamic_config.yaml

2、运行Kafka-ui容器

# 拉取镜像
sudo docker pull provectuslabs/kafka-ui:v0.7.2
 
# 运行容器
sudo docker run --privileged=true \
--net=bridge \
-d --name=kafka-ui \
-p 18080:8080 \
-v /data/docker/kafka-ui/config/dynamic_config.yaml:/etc/kafkaui/dynamic_config.yaml
-e KAFKA_CLUSTERS_0_NAME=kafka-cluster \
-e KAFKA_CLUSTERS_0_BOOTSTRAP_SERVERS=192.168.3.9:9092 \
-e SERVER_SERVLET_CONTEXT_PATH=/ \
-e AUTH_TYPE=LOGIN_FORM \
-e SPRING_SECURITY_USER_NAME=admin \
-e SPRING_SECURITY_USER_PASSWORD=admin \
-e TZ=Asia/Shanghai \
-e LANG=C.UTF-8 \
provectuslabs/kafka-ui:v0.7.2

参数解析如下:

参数参数说明
docker run运行 Docker 容器
-d容器将在后台运行,而不是占用当前的终端会话
--privileged=trueDocker会赋予容器几乎与宿主机相同的权限
--net=bridge网络模式配置,默认是bridge,bridge表示使用容器内部配置网络
--name kafka-ui给容器命名为 kafka-ui,以便于管理和引用该容器
-p 18080:8080映射 kafka-ui 的web端口

-v /data/docker/kafka-ui/config/dynamic_config.yaml:

/etc/kafkaui/dynamic_config.yaml

挂载配置文件,确保config/dynamic_config.yaml文件存在
-e SERVER_SERVLET_CONTEXT_PATH=/默认kafka-ui是免登录的,为了防止所有人都可以登录产生误操作问题,在docker部署的时候可以添加如下四个环境变量配置用户的登录密码。
-e AUTH_TYPE=LOGIN_FORM
-e SPRING_SECURITY_USER_NAME=admin
-e SPRING_SECURITY_USER_PASSWORD=admin
-e KAFKA_CLUSTERS_0_NAME=kafka-cluster自定义集群名称

-e KAFKA_CLUSTERS_0_BOOTSTRAP_SERVERS=

192.168.3.9:9092

集群地址,如有多个地址逗号分隔;需要修改为对应的Kafka的外网地址。

3、Compose运行Kafka-ui容器

创建docker-compose.yml文件

sudo touch /data/docker/kafka-ui/docker-compose.yml

文件内容如下:

version: '3'
 
services:
  kafka:
    image: provectuslabs/kafka-ui:v0.7.2
    container_name: kafka-ui
    ports:
      - "18080:8080"
    environment:
      - TZ=Asia/Shanghai
      - LANG=C.UTF-8
      - DYNAMIC_CONFIG_ENABLED=true
      - KAFKA_CLUSTERS_0_NAME=kafka-cluster
      - KAFKA_CLUSTERS_0_BOOTSTRAP_SERVERS=192.168.3.9:9092
      - SERVER_SERVLET_CONTEXT_PATH=/
      - AUTH_TYPE=LOGIN_FORM
      - SPRING_SECURITY_USER_NAME=admin
      - SPRING_SECURITY_USER_PASSWORD=admin
    volumes:
      - /data/docker/kafka-ui/config/dynamic_config.yaml:/etc/kafkaui/dynamic_config.yaml
    privileged: true
    network_mode: "bridge"

运行容器

#-f:调用文件,-d:开启守护进程
sudo docker compose -f /data/docker/kafka-ui/docker-compose.yml up -d

4、查看Kafka-ui运行状态

http://192.168.3.9:18080/auth

账号和密码 都是admin

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/966240.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】传值调用与传址调用详解

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 💯前言💯传值调用1. 什么是传值调用?2. 示例代码:传值调用失败的情况执行结果: 3. 为什么传值调用无法修改外部变量? &#x1f4…

HarmonyOS 5.0应用开发——ContentSlot的使用

【高心星出品】 文章目录 ContentSlot的使用使用方法案例运行结果 完整代码 ContentSlot的使用 用于渲染并管理Native层使用C-API创建的组件同时也支持ArkTS创建的NodeContent对象。 支持混合模式开发,当容器是ArkTS组件,子组件在Native侧创建时&#…

Golang:Go 1.23 版本新特性介绍

流行的编程语言Go已经发布了1.23版本,带来了许多改进、优化和新特性。在Go 1.22发布六个月后,这次更新增强了工具链、运行时和库,同时保持了向后兼容性。 Go 1.23 的新增特性主要包括语言特性、工具链改进、标准库更新等方面,以下…

11.PPT:世界动物日【25】

目录 NO12​ NO34 NO56​ NO789视频音频​ NO10/11/12​ NO12 设计→幻灯片大小→ →全屏显示(16:9)确定调整标题占位符置于图片右侧:内容占位符与标题占位符左对齐单击右键“世界动物日1”→复制版式→大小→对齐 幻灯片大小…

力扣.623. 在二叉树中增加一行(链式结构的插入操作)

Problem: 623. 在二叉树中增加一行 文章目录 题目描述思路复杂度Code 题目描述 思路 1.首先要说明,对于数据结构无非两大类结构:顺序结构、链式结构,而二叉树实质上就可以等效看作为一个二叉链表,而对于链表插入一个节点的操作是应…

Office/WPS接入DS等多个AI工具,开启办公新模式!

在现代职场中,Office办公套件已成为工作和学习的必备工具,其功能强大但复杂,熟练掌握需要系统的学习。为了简化操作,使每个人都能轻松使用各种功能,市场上涌现出各类办公插件。这些插件不仅提升了用户体验,…

yolov11模型在Android设备上运行【踩坑记录】

0) 参考资料: https://github.com/Tencent/ncnn?tabreadme-ov-file https://github.com/pnnx/pnnx https://github.com/nihui/ncnn-android-yolov5 https://github.com/Tencent/ncnn?tabreadme-ov-file 1) :将xxx.pt模型转化成 xxx.onnx ONNX(Ope…

DeepSeek与llama本地部署(含WebUI)

DeepSeek从2025年1月起开始火爆,成为全球最炙手可热的大模型,各大媒体争相报道。我们可以和文心一言一样去官网进行DeepSeek的使用,那如果有读者希望将大模型部署在本地应该怎么做呢?本篇文章将会教你如何在本地傻瓜式的部署我们的…

arcgis for js范围内天地图高亮,其余底图灰暗

在GIS地图开发中,有时我们需要突出显示某个特定区域,而将其他区域灰暗处理,以达到视觉上的对比效果。本文将介绍如何使用ArcGIS for JavaScript实现这一功能,具体效果为:在指定范围内,天地图高亮显示&#…

基于微信小程序的医院预约挂号系统的设计与实现

hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的在校大学生…

Docker深度解析:安装各大环境

安装 Nginx 实现负载均衡: 挂载 nginx html 文件: 创建过载目录: mkdir -p /data/nginx/{conf,conf.d,html,logs} 注意:在挂载前需要对 conf/nginx.conf 文件进行编写 worker_processes 1;events {worker_connections 1024; …

Linux 源码编译安装httpd 2.4,提供系统服务管理脚本并测试

第一种方式 1. 下载 Apache HTTP Server 源代码 首先,从 Apache 官网 下载最新版本的 httpd 2.4 源码,或者直接使用 wget 下载: [rootlocalhost ~]# wget https://downloads.apache.org/httpd/httpd-2.4.36.tar.gz # 解压 [rootlocalhost ~…

ARM嵌入式学习--第十三天(I2C)

I2C --介绍 I2C(Inter-intergrated Circuit 集成电路)总线是Philips公司在八十年代初推出的一种串行、半双工的总线,主要用于近距离、低速的芯片之间的通信;I2C总线有俩根双向的信号线,一根数据线SDA用于收发数据&…

python爬虫--简单登录

1,使用flask框架搭建一个简易网站 后端代码app.py from flask import Flask, render_template, request, redirect, url_for, sessionapp Flask(__name__) app.secret_key 123456789 # 用于加密会话数据# 模拟用户数据库 users {user1: {password: password1}…

C# 解决“因为算法不同,客户端和服务器无法通信”的问题

目录 故障现象 开发运行环境 解决 实现携带证书的 API URL调用 其它 故障现象 实现微信退款功能,我们需要在微信支付商户后台申请安全证书,并调用退款API URL。在调试过程中为增添返回调试信息属性,重新对.net FrameWorkd 类库进行编译…

【大模型】Ubuntu下安装ollama,DeepSseek-R1:32b的本地部署和运行

1 ollama 的安装与设置 ollama官网链接:https://ollama.com/ 在左上角的【Models】中展示了ollama支持的模型在正中间的【Download】中课可以下载支持平台中的安装包。   其安装和模型路径配置操作流程如下: ollama的安装 这里选择命令安装curl -fsSL …

LLAMA-Factory安装教程(解决报错cannot allocate memory in static TLS block的问题)

步骤一: 下载基础镜像 # 配置docker DNS vi /etc/docker/daemon.json # daemon.json文件中 { "insecure-registries": ["https://swr.cn-east-317.qdrgznjszx.com"], "registry-mirrors": ["https://docker.mirrors.ustc.edu.c…

快速上手——.net封装使用DeekSeek-V3 模型

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,用爱发电,去丈量人心,是否能达到人机合一?开工大吉 新的一年就这么水灵灵的开始了,在这里,祝各位读者新春快乐,万事如意! 新年伊…

高德地图python地理编码和geopandas应用判断坐标点空间位置

在本人另一篇文章(高德地图地理编码python(版本3.9)爬虫(含坐标转换及数据表模板)-CSDN博客)的基础上增加geopandas功能,使脚本能自动根据查找的高德地图坐标与现有的几何范围进行交互&#xff…

Pygame介绍与游戏开发

提供pygame功能介绍的文档:Pygame Front Page — pygame v2.6.0 documentation 基础语法和实现逻辑 与CLI不同,pygame提供了图形化使用界面GUI(graphical user interface)基于图像的界面可以创建一个有图像和颜色的窗口 要让py…