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)

相关推荐
GEM的左耳返4 小时前
Java面试全攻略:Spring生态与微服务架构实战
spring boot·redis·spring cloud·微服务·kafka·java面试
ldj20207 小时前
Docker的docker-compose类比Spring的ApplicationContext
spring·docker
ldj20207 小时前
docker 自定义网桥作用
docker·容器
不辉放弃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·容器
qq_4477053115 小时前
宝塔通过docker部署JupyterHub指南【常见错误处理】
运维·docker·容器