kafka官方文档https://kafka.apache.org/documentation/#quickstart 我们都知道kafka3.0之前依赖于zookeeper(zk)管理其中的元数据,因此在安装kafka之前先安装zk。

docker pull wurstmeister/zookeeper

启动zk服务:

docker run -d --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2  --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime wurstmeister/zookeeper

安装kafka:目前kafka的docker镜像主要是两个版本:wurstmeister/kafkabitnami/kafka ,本次选用的是后者。

# bitnami/kafka
docker pull bitnami/kafka:latest
# wurstmeister/kafka
docker pull wurstmeister/kafka

启动kafka服务:

sudo docker run -d  --privileged=true \
--name kafka0 -p 9092:9092 \
-e KAFKA_BROKER_ID=0 \
-e KAFKA_ZOOKEEPER_CONNECT=IP:2181 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://IP:9092 \
-e ALLOW_PLAINTEXT_LISTENER=yes \
bitnami/kafka:latest

参数解释:

-d :后台运行
–privileged:使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。
-p:暴露端口,-p 9092:9092 将容器内部的9092端口映射到宿主机的端口上。
– name 当前容器的名字。
KAFKA_BROKER_ID : broker的ID,这个ID是集群的标识,不能重复。
KAFKA_ZOOKEEPER_CONNECT:zookeeper的连接地址
KAFKA_LISTENERS:标识kafka服务运行在容器内的9092端口,因为没有指定host,所以是0.0.0.0标识所有的网络接口。
KAFKA_ADVERTISED_LISTENERS:kafka发布到zookeeper供客户端使用的服务地址。
ALLOW_PLAINTEXT_LISTENER :允许使用PLAINTEXT侦听器。

如果需要进行目录挂载,则使用下面的命令(注意一个服务只能挂载一个目录)

-v /usr/kafka/data:/bitnami/kafka/data 
-v /usr/kafka/config:/bitnami/kafka/config 
# /usr/kafka/data是宿主机的目录,/bitnami/kafka/data  是容器内的目录,data做数据映射,config做配置文件映射

按照上面的命令,我们只需要修改nameportbrokerid就能搭建多个kafka服务,为了简单,zookeeper这里就只搭建了一台,而kafka搭建了三台,最终的集群规模如下:

name

port

brokerid

kafka0

9092

0

kafka1

9093

1

kafka2

9094

2

搭建完成后我们可以使用docker ps命令查看服务是否真的启动了:

sudo docker ps

如果你的服务启动异常,docker ps不能查看到,这时候就需要我们进行问题排查了,可以查看docker容器日志:

命令格式:docker logs [OPTIONS] CONTAINER
OPTIONS说明:
-f : 跟踪日志输出
--since :显示某个开始时间的所有日志
-t : 显示时间戳
--tail :仅列出最新N条容器日志
如:docker logs --since="2022-09-01" --tail=10 kafka0

启动完成之后,我们可以进入容器中使用命令验证
进入容器命令:

docker exec -it kafka /bin/bash

kafka的各个脚本都在:/opt/bitnami/kafka/bin下面,如kafka-topics.shkafka-console-consumer.sh
创建主题(可指定分区数、副本数…):

/opt/bitnami/kafka/bin/kafka-topics.sh --create --topic test-kafka0 --replication-factor 3 --partitions 3 --bootstrap-server IP:9092
# 参数解释
--create 表示创建
--topic 指定主题名称
--replication-factor 指定副本数
partitions 指定分区数
--bootstrap-server 连接kafka服务器

查看主题的描述信息(分区、副本、Leader…):

/opt/bitnami/kafka/bin/kafka-topics.sh --describe --topic test-kafka0 --bootstrap-server IP:9092
# 参数解释
--describe 表示查看描述信息

生产者生产消息:

/opt/bitnami/kafka/bin/kafka-console-producer.sh --topic test-kafka0 --bootstrap-server IP:9092

另外进入一个容器,如进入kafka1中进行消费:

/opt/bitnami/kafka/bin/kafka-console-consumer.sh --topic test-kafka0 --from-beginning --bootstrap-server IP:9092

其中,--from-beginning表示会消费历史消息,如果不配置,只能消费消费者节点上线之后生产者发送的消息。