Docker安装Kafka
Docker安装Kafka
由于kafka
依赖zookeeper
,因此需要使用 docker 同时安装zookeeper
和 kafka
1-拉取安装镜像
# 1、下载zookeeper镜像 |
2-启动服务
# 启动 zookeeper |
# 启动kafka镜像生成容器 |
参数说明:
-d:参数指定容器后台运行
–name kafka:参数指定容器别名
-e
参数可以设置 docker 容器内环境变量,每个变量的解释:
-e KAFKA_BROKER_ID=0:在kafka集群中,每个kafka都有一个BROKER_ID来区分自己
-e KAFKA_ZOOKEEPER_CONNECT=host.docker.internal:2181/kafka:配置zookeeper管理kafka的路径host.docker.internal:2181/kafka
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://host.docker.internal:9092:把kafka的地址端口注册给zookeeper,如果是远程访问要改成外网IP,类如 Java 程序访问出现无法连接。
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092:配置kafka的监听端口
-v
参数设置:
-v /etc/localtime:/etc/localtime 容器时间同步虚拟机的时间
注意点:
比如我的电脑是 mac,在 host-ip 这块就不能填本机 ip(windows 和 linux 可以),需要填docker.for.mac.host.internal或者host.docker.internal,zookeeper 端口启动在 2181,kafka 即将启动在 9092,那么我的命令可以是这样的docker run -d –name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=host.docker.internal:2181/kafka -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://host.docker.internal:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka,如果要对日志文件做限制,可以参靠上面的命令。
由于 macOS 的 docker 底层实现的不同,主要原因是 macOS 的 docker 在容器和宿主之间无法通过 ip 直接通信。因此在安装的时候需要特殊注意与 ip 相关的设置,当容器需要访问宿主ip时,需要使用docker.for.mac.host.internal或者host.docker.internal代替。
这里向zookeeper注册的时候,使用的是host.docker.internal,我们在程序中连接kafka的时候,直接使用localhost会报错,如:Error connecting to node host.docker.internal:9092,其处理方式:
- 我们可以在本机的 host 文件中,添加映射,将 127.0.0.1 host.docker.internal;
- 不使用host.docker.internal,而是使用自己主机IP,但是当IP发生变化的时候,就要重新配置。
# 测试容器内访问宿主机ip |
3-验证
3.1-进入 kafka 容器
docker exec -it kafka bash |
3.2-进入 kafka 容器中的脚本目录
注意,此时应该已经进入到了容器中的bash
。进入 kafka 的脚本目录,其中kafka_2.13-2.7.0
可能会随着版本而变化数字。
bash-5.1# cd opt/kafka_2.13-2.7.0/bin/ |
通过 ls 可以看到许多的.sh 脚本
bash-5.1# ls |
3.3-测试 kafka 生产者和消费者
1. 启动 kafka 生产者
运行 kafka 生产者发送消息
./kafka-console-producer.sh --broker-list localhost:9092 --topic test-topic |
看到出现了个对话提示的小>
就可以发送消息了,不过不要着急,先把消费者启动了。
2. 启动 kafka 消费者
另起一个终端,进入 kafka 容器,进入/opt/kafka_2.13-2.7.0/bin
目录,运行 kafka 消费者接收消息
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --from-beginning |
3. 测试发送和接收消息
在生产者中发送消息,消费者中应该能够收到对应的消息。
生产者
bash-5.1# ./kafka-console-producer.sh --broker-list localhost:9092 --topic test-topic |
消费者
bash-5.1# ./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --from-beginning |
4. 创建topic并查看
创建topic
# 创建脚本 |
查看topic
# 查看topic脚本 |
5. 查看消费者组的消费情况
查看的脚本
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group group02 |
返回结果
GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID |
- TOPIC:topic名字
- PARTITION:分区id
- CURRENT-OFFSET:当前已消费的条数
- LOG-END-OFFSET:总条数
- LAG:未消费的条数(延迟)
- CONSUMER-ID:消费id
- HOST:主机ip
- CLIENT-ID:客户端id