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

Docker 安装 kafka (bitnami/kafka:4.0)

1、拉取镜像

docker pull bitnami/kafka:4.0

2、创建挂载目录

mkdir -p /user/lzl/tool/docker/kafka/bitnami/bitnami_kafka_4.0/home/data
mkdir -p /user/lzl/tool/docker/kafka/bitnami/bitnami_kafka_4.0/home/logs

3、给挂载目录授权

chmod 777 /user/lzl/tool/docker/kafka/bitnami/bitnami_kafka_4.0/home/data
chmod 777 /user/lzl/tool/docker/kafka/bitnami/bitnami_kafka_4.0/home/logs

4、运行容器

4.1、运行命令

docker run -d \--name bitnami_kafka_4.0 \--restart always \--ulimit nofile=65536:65536 \-e TZ=Asia/Shanghai \-e KAFKA_ENABLE_KRAFT=yes \-e KAFKA_CFG_NODE_ID=0 \-e KAFKA_CFG_PROCESS_ROLES=controller,broker \-e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@127.0.0.1:9093 \-e KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \-e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://113.45.38.93:9092 \-e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT \-e KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER \-e KAFKA_CFG_LOG_DIRS=/bitnami/kafka/data \-p 9092:9092 \-v /user/lzl/tool/docker/kafka/bitnami/bitnami_kafka_4.0/home/data:/bitnami/kafka \-v /user/lzl/tool/docker/kafka/bitnami/bitnami_kafka_4.0/home/logs:/opt/bitnami/kafka/logs \--memory=512m \--cpus="1.0" \bitnami/kafka:4.0

4.2、命令解释

下面先给出这条 docker run 命令的整体概览,然后逐行详解各个参数和环境变量的作用。

这条命令启动了一个基于 Bitnami 提供的 Kafka 4.0 镜像的容器,并在 KRaft 模式(即不依赖 Zookeeper)下同时担任 controller 和 broker。它设置了时区、节点 ID、监听器及广告地址,指定数据和日志存储目录,限制了文件句柄数、内存和 CPU 使用,并在主机上映射了对应端口,保证容器重启策略为“始终重启”。


4.2.1、 基本启动与命名
docker run -d \--name bitnami_kafka_4.0 \--restart always \
  • docker run -d:以“后台模式”(detached)启动容器,使其在后台运行,不占用当前终端。
  • --name bitnami_kafka_4.0:为容器指定名字,方便后续管理和运维。
  • --restart always:容器退出(无论退出码为何)或 Docker 守护进程重启后,都会自动重启该容器,保证 Kafka 服务的高可用性。

4.2.2、 文件句柄限制
  --ulimit nofile=65536:65536 \
  • --ulimit nofile=65536:65536:将容器内“最大打开文件数”(nofile)软限制和硬限制都设置为 65536,避免 Kafka 在高并发情况下因文件描述符不足而崩溃。

4.2.3、时区设置
  -e TZ=Asia/Shanghai \
  • -e TZ=Asia/Shanghai:设置容器时区为北京时间(东八区),使 Kafka 日志及监控时间戳与本地时间保持一致,便于分析与排查。

4.2.4、 KRaft 模式开启及节点角色
  -e KAFKA_ENABLE_KRAFT=yes \-e KAFKA_CFG_NODE_ID=0 \-e KAFKA_CFG_PROCESS_ROLES=controller,broker \-e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@127.0.0.1:9093 \
  • KAFKA_ENABLE_KRAFT=yes:启用 KRaft 模式(Kafka Raft Metadata),这是 Kafka 未来推荐的无 Zookeeper 架构。
  • KAFKA_CFG_NODE_ID=0:为该 Kafka 实例分配唯一的节点 ID,KRaft 模式下用于集群内部元数据选举。
  • KAFKA_CFG_PROCESS_ROLES=controller,broker:指定该节点同时承担 “controller” 和 “broker” 两种角色。
  • KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@127.0.0.1:9093:定义控制器选举的投票列表,格式为 <nodeId>@<host>:<port>,此处只有一个节点自身(单节点集群)。

4.2.5、 监听器配置
  -e KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \-e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://IP:9092 \-e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT \-e KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER \
  • KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093:定义两个监听端口:
    • PLAINTEXT:对外提供普通客户端连接,监听容器内部 9092 端口;
    • CONTROLLER:内部控制器通信,监听容器内部 9093 端口。
  • KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://IP:9092:告诉客户端连接时使用的地址和端口,通常设置为宿主机或对外 IP,方便外部服务或用户连接。
  • KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT:将每个监听器映射到安全协议,此处均为明文(PLAINTEXT)。
  • KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER:指定用于 controller 通信的监听器名称为 CONTROLLER

4.2.6、 日志与数据目录挂载
  -e KAFKA_CFG_LOG_DIRS=/bitnami/kafka/data \-p 9092:9092 \-v /user/lzl/tool/docker/kafka/bitnami/bitnami_kafka_4.0/home/data:/bitnami/kafka \-v /user/lzl/tool/docker/kafka/bitnami/bitnami_kafka_4.0/home/logs:/opt/bitnami/kafka/logs \
  • KAFKA_CFG_LOG_DIRS=/bitnami/kafka/data:Kafka 存储分区数据的目录。
  • -p 9092:9092:将宿主机的 9092 端口映射到容器的 9092,使外部客户端可以访问。
  • -v …/data:/bitnami/kafka:把宿主机的数据目录挂载到容器中,用于持久化 Kafka topic 数据。
  • -v …/logs:/opt/bitnami/kafka/logs:把宿主机的日志目录挂载到容器,用于持久化 Kafka 日志文件,便于排查。

4.2.7、 资源限制
  --memory=512m \--cpus="1.0" \
  • --memory=512m:限制容器使用最多 512MB 内存,避免单容器占用过多宿主机资源。
  • --cpus="1.0":限制容器最多使用一个 CPU 核心,保障宿主机上其他服务的性能。

4.2.8、 镜像与版本
  bitnami/kafka:4.0
  • 使用 Bitnami 官方维护的 bitnami/kafka:4.0 镜像。Bitnami 镜像通常附带最佳实践的配置和管理脚本,方便快速部署生产级 Kafka 服务。

相关文章:

  • 2025系统架构师---论软件架构风格
  • android Observable 和Observer 是什么
  • 探索DeepWiki:GitHub源码阅读的变革性工具
  • Python 自动化办公:Excel 数据处理的“秘密武器”
  • Linux Socket编程:从API到实战
  • 【2025最近Java面试八股】Spring中循环依赖的问题?怎么解决的?
  • 深度理解linux系统—— 进程概念
  • 端到端算法在SLAM中的应用:从理论到实践全解析
  • PlatformIO 入门学习笔记(一):背景了解
  • vue3项目中模拟AI的深度思考功能2.0
  • 2025 VSCode中如何进行dotnet开发环境配置完整教程
  • 【Java学习笔记】类与对象
  • 【文心快码】确实有点东西!
  • STM32标准库和HAL库SPI发送数据的区别-即SPI_I2S_SendData()和HAL_SPI_Transmit()互换
  • 计算机网络笔记(十四)——3.1数据链路层的几个共同问题
  • 03.使用spring-ai玩转MCP
  • ALTER TABLE 删除DROP表列的报错: 因为有一个或多个对象访问此列
  • 4.27 JavaScript核心语法+事件监听
  • 如何通过git删除某个文件的历史提交记录
  • 类-python
  • 药明康德一季度净利增长89%,在手订单增超四成至523亿元
  • “五一”假期全国口岸日均出入境人员将达215万人次
  • 亚振家居控制权将变更:济南域潇集团实控人成新控股股东
  • 科克托是说真话的骗子,而毕加索是一言不发、让大家去猜的人
  • 文昌市委原书记龙卫东已任海南省人社厅党组书记
  • 中宣部版权管理局:微短剧出海面临版权交易不畅、海外维权较难等难题