docker-compose部署kafka单机和集群

版本选择

使用 docker-compose 部署 Kafka:3.5。

从 3.3 版本后,Kafka 引入了 KRaft 来替代 ZooKeeper,所以我们不必再部署 zk 了。

单机部署

记得修改 KAFKA_CFG_ADVERTISED_LISTENERS 的 ip 为自己的

yaml 复制代码
 version: "2"
 
 services:
   kafka:
     container_name: kafka
     image: 'bitnami/kafka:3.5'
     ports:
       - '19092:9092'
       - '19093:9093'
     environment:
       ### 通用配置
       # 允许使用kraft,即Kafka替代Zookeeper
       - KAFKA_ENABLE_KRAFT=yes
       - KAFKA_CFG_NODE_ID=1
       # kafka角色,做broker,也要做controller
       - KAFKA_CFG_PROCESS_ROLES=controller,broker
       # 定义kafka服务端socket监听端口(Docker内部的ip地址和端口)
       - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
       # 定义外网访问地址(宿主机ip地址和端口)ip不能是0.0.0.0
       - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://ip:19092
       # 定义安全协议
       - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
       # 集群地址
       - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka:9093
       # 指定供外部使用的控制类请求信息
       - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
       # 设置broker最大内存,和初始内存
       - KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
       # 使用Kafka时的集群id,集群内的Kafka都要用这个id做初始化,生成一个UUID即可(22byte)
       - KAFKA_KRAFT_CLUSTER_ID=xYcCyHmJlIaLzLoBzVwIcP
       # 允许使用PLAINTEXT监听器,默认false,不建议在生产环境使用
       - ALLOW_PLAINTEXT_LISTENER=yes
       # 不允许自动创建主题
       - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false
       # broker.id,必须唯一,且与KAFKA_CFG_NODE_ID一致
       - KAFKA_BROKER_ID=1

集群部署

记得修改 KAFKA_CFG_ADVERTISED_LISTENERS 的 ip 地址为自己的

我们之后测试肯定用集群部署,就算是测试,也不用单机模式,单机就是玩具哈 = =

这里部署了 3 个 Broker,即 Kafka1、Kafka2 和 Kafka3

yaml 复制代码
 version: "2"
 
 services:
   kafka1:
     container_name: kafka1
     image: 'bitnami/kafka:3.5'
     ports:
       - '19092:9092'
       - '19093:9093'
     environment:
       ### 通用配置
       # 允许使用kraft,即Kafka替代Zookeeper
       - KAFKA_ENABLE_KRAFT=yes
       - KAFKA_CFG_NODE_ID=1
       # kafka角色,做broker,也要做controller
       - KAFKA_CFG_PROCESS_ROLES=controller,broker
       # 定义kafka服务端socket监听端口(Docker内部的ip地址和端口)
       - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
       # 定义外网访问地址(宿主机ip地址和端口)ip不能是0.0.0.0
       - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://ip:19092
       # 定义安全协议
       - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
       # 集群地址
       - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
       # 指定供外部使用的控制类请求信息
       - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
       # 设置broker最大内存,和初始内存
       - KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
       # 使用Kafka时的集群id,集群内的Kafka都要用这个id做初始化,生成一个UUID即可(22byte)
       - KAFKA_KRAFT_CLUSTER_ID=xYcCyHmJlIaLzLoBzVwIcP
       # 允许使用PLAINTEXT监听器,默认false,不建议在生产环境使用
       - ALLOW_PLAINTEXT_LISTENER=yes
       # 不允许自动创建主题
       - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false
       # broker.id,必须唯一,且与KAFKA_CFG_NODE_ID一致
       - KAFKA_BROKER_ID=1
     volumes:
       - ./kafka/broker1:/bitnami/kafka:rw
 
   kafka2:
     container_name: kafka2
     image: 'bitnami/kafka:3.5'
     ports:
       - '29092:9092'
       - '29093:9093'
     environment:
       ### 通用配置
       # 允许使用kraft,即Kafka替代Zookeeper
       - KAFKA_ENABLE_KRAFT=yes
       - KAFKA_CFG_NODE_ID=2
       # kafka角色,做broker,也要做controller
       - KAFKA_CFG_PROCESS_ROLES=controller,broker
       # 定义kafka服务端socket监听端口(Docker内部的ip地址和端口)
       - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
       # 定义外网访问地址(宿主机ip地址和端口)ip不能是0.0.0.0
       - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://ip:29092
       # 定义安全协议
       - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
       # 集群地址
       - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
       # 指定供外部使用的控制类请求信息
       - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
       # 设置broker最大内存,和初始内存
       - KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
       # 使用Kafka时的集群id,集群内的Kafka都要用这个id做初始化,生成一个UUID即可(22byte)
       - KAFKA_KRAFT_CLUSTER_ID=xYcCyHmJlIaLzLoBzVwIcP
       # 允许使用PLAINTEXT监听器,默认false,不建议在生产环境使用
       - ALLOW_PLAINTEXT_LISTENER=yes
       # 不允许自动创建主题
       - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false
       # broker.id,必须唯一,且与KAFKA_CFG_NODE_ID一致
       - KAFKA_BROKER_ID=2
     volumes:
       - ./kafka/broker2:/bitnami/kafka:rw

   kafka3:
     container_name: kafka3
     image: 'bitnami/kafka:3.5'
     ports:
       - '39092:9092'
       - '39093:9093'
     environment:
       ### 通用配置
       # 允许使用kraft,即Kafka替代Zookeeper
       - KAFKA_ENABLE_KRAFT=yes
       - KAFKA_CFG_NODE_ID=3
       # kafka角色,做broker,也要做controller
       - KAFKA_CFG_PROCESS_ROLES=controller,broker
       # 定义kafka服务端socket监听端口(Docker内部的ip地址和端口)
       - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
       # 定义外网访问地址(宿主机ip地址和端口)ip不能是0.0.0.0
       - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://ip:39092
       # 定义安全协议
       - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
       # 集群地址
       - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
       # 指定供外部使用的控制类请求信息
       - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
       # 设置broker最大内存,和初始内存
       - KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
       # 使用Kafka时的集群id,集群内的Kafka都要用这个id做初始化,生成一个UUID即可(22byte)
       - KAFKA_KRAFT_CLUSTER_ID=xYcCyHmJlIaLzLoBzVwIcP
       # 允许使用PLAINTEXT监听器,默认false,不建议在生产环境使用
       - ALLOW_PLAINTEXT_LISTENER=yes
       # 不允许自动创建主题
       - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false
       # broker.id,必须唯一,且与KAFKA_CFG_NODE_ID一致
       - KAFKA_BROKER_ID=3
     volumes:
       - ./kafka/broker3:/bitnami/kafka:rw

踩坑 volumes 权限问题

这里把镜像里的路径挂载到宿主机了,但是这里开启的时候会遇到一个权限报错:

sh 复制代码
 mkdir: cannot create directory '/bitnami/kafka/config': Permission denied

第一次开启后,./kafka/... 下的目录都创建好了,此时需要给 1001 用户和组添加权限:

sh 复制代码
 sudo chown -R 1001:1001 kafka

再次启动镜像就没问题了~

这个问题 stackoverflow 和 github issues 都有提及:

[bitnami/kafka] Cannot create directory '/bitnami/kafka/config': Permission denied · Issue #41422 · bitnami/containers (github.com)

kubernetes - mkdir: cannot create directory '/bitnami/kafka/config': Permission denied - Stack Overflow

在 issues 中有这样的回复:

Yes, if the directory from your host is mapped to the container using a volume, the owner of that directory should be the UID 1001

所以我们上面加了权限后,就可以正常运行了。

轻量级 Kafka 可视化工具 ------ kafka-console-ui

这里我使用国内大佬开发的一个管理平台:xxd763795151/kafka-console-ui: 一款快捷易用的轻量级kafka可视化管理平台 (github.com)

依然是使用 docker-compose 部署:

yaml 复制代码
 version: '3'
 services:
   # 服务名
   kafka-console-ui:
     # 容器名
     container_name: "kafka-console-ui"
     # 端口
     ports:
       - "7766:7766"
     # 持久化
     # volumes:
       # - ./data:/app/data
       # - ./log:/app/log
     # 防止读写文件有问题
     privileged: true
     user: root
     # 镜像地址
     image: "wdkang/kafka-console-ui"
     expose:
       - "7766"

配置集群

打开管理工具的运维界面kafka-console-ui,我这里部署在了本地

选择集群切换 -> 新增集群,填好配置后,选择切换,就可以管理我们的 kafka 集群了

*注意 & PS

  1. KAFKA_CFG_ADVERTISED_LISTENERS 外网访问的 ip 地址不能是 0.0.0.0

  2. KAFKA_BROKER_ID 必须与 KAFKA_CFG_NODE_ID 保持一致

  3. KAFKA_KRAFT_CLUSTER_ID 可以使用菜鸟工具生成一个 22 位随机字符

  4. 以上两个部署 kafka 的 yaml 文件中,都设置了 KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=false,表示不自动创建 topic,必须手动创建,比如可以通过 kafka-console-ui 的 Topic 页签来操作:

参考 & 致谢

docker安装kafka(Kraft集群版) - 掘金 (juejin.cn)

kubernetes - mkdir: cannot create directory '/bitnami/kafka/config': Permission denied - Stack Overflow

[bitnami/kafka] Cannot create directory '/bitnami/kafka/config': Permission denied · Issue #41422 · bitnami/containers (github.com)

kafka(kraft模式)3.*集群容器部署 docker-compose - mrdongdong - 博客园 (cnblogs.com)

Docker Hub

kafka-console-ui/document/deploy/docker部署.md at main · xxd763795151/kafka-console-ui (github.com)

相关推荐
一碗手擀面43 分钟前
docker镜像发布的应用程序,其配置https的流程
docker·容器·https
千羽星弦2 小时前
kafka zookeeper 集群搭建
kafka
追风林2 小时前
mac 本地 docker 安装 kafka
macos·docker·kafka
奔跑中的小象3 小时前
低版本 Linux 系统通过二进制方式升级部署高版本 Docker
linux·docker
最数据3 小时前
收集了一些docker修改镜像源地址
docker·容器·镜像源·国内源地址
人间凡尔赛4 小时前
VSCode-Server 在 Linux 容器中的手动安装指南
linux·运维·服务器·docker
Sans_5 小时前
初识Docker-Compose(包含示例)
后端·docker·容器
Java程序之猿5 小时前
Centos 安装docker,docker-compose
linux·docker·centos
austin流川枫5 小时前
Kafka如何配置确保dev开发不要消费test环境的消息
kafka
TechStack 创行者6 小时前
Docker+Flask 实战:打造高并发微服务架构
运维·docker·微服务·容器·架构