docker安装kafka非zookeeper版

Docker安装非Zookeeper版Kafka

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

<think> 我们注意到用户的需求是不依赖Zookeeper安装Kafka 2.8.1单机。从Kafka 2.8.0本开始,Kafka引入了Kraft模式,允许在不使用Zookeeper的情况下运行Kafka集群。因此,我们可以使用Kraft模式来安装单机Kafka。 根据引用[2]中提到的镜像`bitnami/kafka:2.8.1`,我们可以使用该镜像,并通过环境变量配置Kraft模式。 步骤: 1. 拉取镜像:`docker pull bitnami/kafka:2.8.1` 2. 运行容器,配置Kraft模式所需的环境变量。 在Kraft模式下,Kafka使用一个内部元数据存储(基于Raft协议)替代Zookeeper。我们需要配置节点角色(broker和controller可以合并在一个节点上)并提供一个集群ID。 具体操作: - 设置环境变量`KAFKA_CFG_PROCESS_ROLES`为`broker,controller`(表示此节点同时担任broker和controller角色) - 设置环境变量`KAFKA_CFG_CONTROLLER_QUORUM_VOTERS`(投票者列表),对于单节点,设置为`1@<节点名>:9093`,其中1是节点ID,9093是控制器端口。 - 设置环境变量`KAFKA_CFG_NODE_ID`(节点ID) - 设置环境变量`KAFKA_CLUSTER_ID`(集群ID),可以通过命令生成,例如使用`bin/kafka-storage.sh random-uuid`生成的ID(在容器内执行),但我们可以预先生成一个,或者让容器启动脚本生成(bitnami镜像可能提供了自动生成的方法,但为了可靠,我们可以自己生成)。 另外,还需要配置监听器(advertised listeners)等。 注意:bitnami镜像提供了一些环境变量来简化配置。例如: - `KAFKA_CFG_PROCESS_ROLES`: 节点角色 - `KAFKA_CFG_CONTROLLER_QUORUM_VOTERS`: 投票者列表 - `KAFKA_CFG_NODE_ID`: 节点ID - `KAFKA_KRAFT_CLUSTER_ID`: 集群ID(注意,在bitnami镜像中可能使用`KAFKA_KRAFT_CLUSTER_ID`,而不是`KAFKA_CLUSTER_ID`,需要查看文档或镜像说明) 由于用户要求单机,我们可以这样运行容器: 首先,生成一个集群ID(可以使用uuid生成): 在命令行中执行:`docker run --rm bitnami/kafka:2.8.1 /opt/bitnami/kafka/bin/kafka-storage.sh random-uuid` 来生成一个UUID,例如:`abc123` 然后,运行容器: ```bash docker run -d --name kafka \ -p 9092:9092 \ -e KAFKA_CFG_PROCESS_ROLES=broker,controller \ -e KAFKA_CFG_NODE_ID=1 \ -e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka:9093 \ -e KAFKA_KRAFT_CLUSTER_ID=abc123 \ -e KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \ -e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \ -e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT \ -e KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER \ -e ALLOW_PLAINTEXT_LISTENER=yes \ --restart=always \ bitnami/kafka:2.8.1 ``` 解释: - `KAFKA_CFG_LISTENERS`: 定义监听器,PLAINTEXT监听器用于broker通信(端口9092),CONTROLLER监听器用于控制器通信(端口9093)。 - `KAFKA_CFG_ADVERTISED_LISTENERS`: 对外公布的监听器地址,客户端连接使用。 - `KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP`: 指定每个监听器的安全协议,这里都是PLAINTEXT(明文)。 - `KAFKA_CFG_CONTROLLER_LISTENER_NAMES`: 指定用于控制器通信的监听器名称,这里使用CONTROLLER。 注意:由于容器内主机名是`kafka`(容器名称),所以在`KAFKA_CFG_CONTROLLER_QUORUM_VOTERS`中使用了`kafka:9093`。但如果容器名称不是`kafka`,则需要使用正确的主机名。这里我们使用容器名称`kafka`,所以在运行容器时指定了`--name kafka`,这样容器内部的主机名就是`kafka`。 另外,需要确保控制器端口(9093)在容器内部使用,不需要映射到宿主机(因为只有一个节点,且只在容器内部使用)。 以上配置在单节点Kraft模式下应该可以运行。 测试: 我们可以进入容器创建一个主题并生产消费消息来测试。 但是,用户可能更关心的是如何验证安装成功,因此我们可以提供简单的测试步骤。 总结:使用Kraft模式,通过上述Docker命令即可运行不依赖ZookeeperKafka单机。 注意:由于Kraft模式在早期本可能存在稳定性问题,但2.8.1本已经相对稳定。 另外,引用[1]中提到了kafka-manager(CMAK),但kafka-manager不支持Kraft模式(截至2023年),所以如果需要管理界面,可能需要寻找其他工具。 相关问题: 1. 如何验证Kafka单机安装成功? 2. 在Kraft模式下,Kafka的配置与依赖Zookeeper时有何不同? 3. 如何升级到多节点的Kraft集群? </think> ### 不依赖ZookeeperDocker单机安装Kafka 2.8.1指南 从Kafka 2.8.0开始,官方支持**Kraft模式**(KRaft),允许Kafka不依赖Zookeeper独立运行。以下是基于Kraft模式的单机安装方法: #### 安装步骤 1. **生成集群ID** 先创建集群唯一标识(在宿主机执行): ```bash docker run --rm bitnami/kafka:2.8.1 kafka-storage.sh random-uuid # 输出示例: abc12345-xxxx-yyyy-zzzz-1234567890 ``` 2. **启动Kafka容器** 替换`<CLUSTER_ID>`为上一步生成的ID: ```bash docker run -d --name kafka \ -p 9092:9092 \ -e KAFKA_CFG_PROCESS_ROLES=broker,controller \ -e KAFKA_CFG_NODE_ID=1 \ -e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka:9093 \ -e KAFKA_KRAFT_CLUSTER_ID=<CLUSTER_ID> \ -e KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \ -e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \ -e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT \ -e KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER \ --restart=unless-stopped \ bitnami/kafka:2.8.1 ``` #### 关键配置说明 | 环境变量 | 作用 | |----------|------| | `KAFKA_CFG_PROCESS_ROLES` | 节点角色(同时充当broker和controller) | | `KAFKA_CFG_CONTROLLER_QUORUM_VOTERS` | 控制器通信地址 `节点ID@主机名:端口` | | `KAFKA_KRAFT_CLUSTER_ID` | 集群唯一标识符 | | `KAFKA_CFG_ADVERTISED_LISTENERS` | 客户端连接地址 | #### 验证安装 ```bash # 进入容器 docker exec -it kafka bash # 创建测试主题 kafka-topics.sh --create \ --topic test \ --bootstrap-server localhost:9092 \ --partitions 1 \ --replication-factor 1 # 查看主题列表 kafka-topics.sh --list --bootstrap-server localhost:9092 ``` #### 注意事项 1. **网络配置** 若需从宿主机外部访问,需将`KAFKA_CFG_ADVERTISED_LISTENERS`设为宿主机IP: ```bash -e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://<宿主机IP>:9092 ``` 2. **数据持久化** 添加卷挂载避免数据丢失: ```bash -v /path/to/data:/bitnami/kafka ``` 3. **防火墙** 确保宿主机9092端口开放: ```bash sudo ufw allow 9092 ``` 此方法完全跳过Zookeeper,通过Kraft的Raft共识协议实现元数据管理,资源开销减少约50%[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值