docker 部署 Kafka 单机和集群

一、准备工作

  1. 安装 Docker
    确保本机已安装 Docker。可以通过以下命令检查 Docker 是否已安装:

    bash 复制代码
    docker --version

如果未安装,可以访问 Docker 官网下载并安装 Docker Desktop(Windows 和 Mac)或使用包管理器安装(Linux)。

  1. 拉取 Kafka 镜像
    打开终端,执行以下命令拉取 Kafka 镜像:

    bash 复制代码
    docker pull bitnami/kafka:latest

    此命令会从 Docker Hub 下载最新版本的 Kafka 镜像,由 Bitnami 提供,该镜像已预配置好 Kafka 的环境和依赖。

单机

Kafka 4.0 将移除zookeeper,仅支持KRaft

所以我们使用KRaft模式,这也是kafka的默认模式.

1.创建数据目录

在本机上创建一个目录用于存放 Kafka 的数据,例如 /data/kafka_data。可以使用以下命令创建:

bash 复制代码
mkdir -p /data/kafka_data

由于这是一个非 root 的容器,挂载的文件和目录必须具有 UID 1001 的适当权限

bash 复制代码
sudo chown -R 1001:1001 /data/kafka_data

2.docker-run启动 Kafka 容器

在终端中执行以下命令启动 Kafka 容器:

bash 复制代码
docker run -d --name kafka \
  -p 9092:9092 -p 9093:9093 \
  -e KAFKA_ENABLE_KRAFT=yes \
  -e KAFKA_CFG_PROCESS_ROLES=broker,controller \
  -e KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER \
  -e KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT \
  -e KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 \
  -e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT \
  -e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://:9092 \
  -e KAFKA_BROKER_ID=1 \
  -e KAFKA_CFG_NODE_ID=1 \
  -e KAFKA_KRAFT_CLUSTER_ID=your_unique_cluster_id \
  -e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@localhost:9093 \
  -e KAFKA_CFG_CONTROLLER_QUORUM_VOTER_CLIENT_QUOTA_WINDOW_NUM=10 \
  -e KAFKA_CFG_CONTROLLER_QUORUM_VOTER_CLIENT_QUOTA_WINDOW_SIZE_SECONDS=1 \
  -e KAFKA_CFG_CONTROLLER_QUORUM_VOTER_REQUEST_TIMEOUT_MS=5000 \
  -v /data/kafka_data:/kafka:rw \
  bitnami/kafka:latest

3.docker-compose部署 Kafka 容器
docker compose -f docker-compose.yml up -d

bash 复制代码
version: "3"

services:
  kafka:
    image: bitnami/kafka:latest
    ports:
      - "9092:9092"
    volumes:
      - "/data/kafka_data:/bitnami"
    environment:
      # KRaft settings
      - KAFKA_CFG_NODE_ID=0
      - KAFKA_CFG_PROCESS_ROLES=controller,broker
      - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@localhost:9093
      # Listeners
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://:9092
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
      - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
      - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT

参数解释

参数名称 说明
KAFKA_ADVERTISED_HOST_NAME 这是 Kafka 服务器的主机名或 IP地址,用于通知生产者和消费者连接到该地址。
KAFKA_ENABLE_KRAFT 这个参数启用 Kafka Raft(KRaft)模式,它是 Kafka 2.8.0版本引入的一种新的高可用性模式。
KAFKA_KRAFT_CLUSTER_ID 这是 KRaft 集群的唯一标识符,用于将 Kafka 服务器加入特定的 KRaft集群。
KAFKA_CFG_PROCESS_ROLES 这个参数指定 Kafka 服务器的角色,其中 "broker" 表示服务器是一个普通的Kafka 节点,"controller" 表示服务器是集群的控制器。
KAFKA_BROKER_ID 这是 Kafka 服务器的唯一标识符,用于在集群中区分不同的服务器。
KAFKA_CFG_NUM_PARTITIONS 这个参数指定每个主题的默认分区数。分区是 Kafka中的消息存储单元,用于实现消息的并行处理。
KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR 这个参数指定偏移量主题的副本因子,偏移量主题用于存储消费者的偏移量信息。
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP 这个参数定义了不同监听器的安全协议映射关系。在这个例子中,"EXTERNAL" 和 "CONTROLLER"分别映射到 "PLAINTEXT" 协议,表示这些监听器使用明文传输。
KAFKA_CFG_LISTENERS 这个参数指定每个主题的默认分区数。分区是 Kafka中的消息存储单元,用于实现消息的并行处理。
KAFKA_CFG_ADVERTISED_LISTENERS 这个参数定义了 Kafka监听器的配置。在这个例子中,有两个监听器分别使用不同的协议和端口号。
KAFKA_CFG_INTER_BROKER_LISTENER_NAME 这个参数指定了经纪人之间通信使用的监听器名称,其中 "CLIENT" 表示使用客户端监听器。
KAFKA_CFG_CONTROLLER_LISTENER_NAMES 这个参数指定控制器监听器的名称,用于控制器与其他经纪人之间的通信。
KAFKA_CFG_CONTROLLER_QUORUM_VOTERS 这个参数指定了控制器选举过程中的投票者信息,包括其 ID和监听器的地址。
ALLOW_PLAINTEXT_LISTENER 这个参数允许使用明文传输的监听器进行连接。
KAFKA_AUTO_CREATE_TOPICS_ENABLE 这个参数启用自动创建主题的功能,当生产者发送消息到不存在的主题时,将自动创建该主题。
KAFKA_CFG_INITIAL_BROKER_REGISTRATION_TIMEOUT_MS 这个参数指定初始经纪人注册的超时时间,以毫秒为单位。在集群启动期间,经纪人必须在指定的时间内完成注册。

集群

生产环境中,机器足够,也需要一定的性能和稳定性。选择推荐使用完整集群方案

在3.0+版本中,基于raft协议的集群元数据管理方式,已经成熟,此处推荐使用kraft协议部署,简化部署方案

以前旧的依赖Zookeeper的方案在此不再提供、研究、维护

集群方式可参考链接

三台服务器,每个节点都承担broker,controller角色

bash 复制代码
# Copyright Broadcom, Inc. All Rights Reserved.
# SPDX-License-Identifier: APACHE-2.0

services:
  kafka-0:
    image: docker.io/bitnami/kafka:3.9
    ports:
      - "9092"
    environment:
      # KRaft settings
      - KAFKA_CFG_NODE_ID=0
      - KAFKA_CFG_PROCESS_ROLES=controller,broker
      - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-0:9093,1@kafka-1:9093,2@kafka-2:9093
      - KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv
      # Listeners
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://:9092
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
      - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
      - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT
      # Clustering
      - KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3
      - KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3
      - KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2
    volumes:
      - kafka_0_data:/bitnami/kafka
  kafka-1:
    image: docker.io/bitnami/kafka:3.9
    ports:
      - "9092"
    environment:
      # KRaft settings
      - KAFKA_CFG_NODE_ID=1
      - KAFKA_CFG_PROCESS_ROLES=controller,broker
      - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-0:9093,1@kafka-1:9093,2@kafka-2:9093
      - KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv
      # Listeners
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://:9092
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
      - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
      - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT
      # Clustering
      - KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3
      - KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3
      - KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2
    volumes:
      - kafka_1_data:/bitnami/kafka
  kafka-2:
    image: docker.io/bitnami/kafka:3.9
    ports:
      - "9092"
    environment:
      # KRaft settings
      - KAFKA_CFG_NODE_ID=2
      - KAFKA_CFG_PROCESS_ROLES=controller,broker
      - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-0:9093,1@kafka-1:9093,2@kafka-2:9093
      - KAFKA_KRAFT_CLUSTER_ID=abcdefghijklmnopqrstuv
      # Listeners
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
      - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://:9092
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
      - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
      - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT
      # Clustering
      - KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=3
      - KAFKA_CFG_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=3
      - KAFKA_CFG_TRANSACTION_STATE_LOG_MIN_ISR=2
    volumes:
      - kafka_2_data:/bitnami/kafka

volumes:
  kafka_0_data:
    driver: local
  kafka_1_data:
    driver: local
  kafka_2_data:
    driver: local
相关推荐
GEM的左耳返3 小时前
Java面试全攻略:Spring生态与微服务架构实战
spring boot·redis·spring cloud·微服务·kafka·java面试
ldj20206 小时前
Docker的docker-compose类比Spring的ApplicationContext
spring·docker
ldj20207 小时前
docker 自定义网桥作用
docker·容器
java叶新东老师7 小时前
k8s常用命令
云原生·容器·kubernetes
不辉放弃7 小时前
kafka的消费者负载均衡机制
数据库·分布式·kafka·负载均衡
土豆丶杨9 小时前
centos 配置docker
docker·eureka·centos
杰哥的狗9 小时前
nacos连接失败,启动失败常见问题
linux·docker
DarkAthena10 小时前
【GaussDB】构建一个GaussDB的Docker镜像
数据库·docker·gaussdb
沉下去,苦磨练!11 小时前
kafka的部署和jmeter连接kafka
分布式·jmeter·kafka
张火火isgudi13 小时前
CentOS8 使用 Docker 搭建 Jellyfin 家庭影音服务器
服务器·docker·容器