Docker安装kafka
下载zookeeper镜像
$ docker pull wurstmeister/zookeeper
2、启动镜像生成容器
docker run -d --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime wurstmeister/zookeeper
$ 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```
3、下载kafka镜像
$ docker pull wurstmeister/kafka
4、启动kafka镜像生成容器
docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.19.131:2181/kafka -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.19.131:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -v /etc/localtime:/etc/localtime wurstmeister/kafka
$ docker run -d --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=172.16.0.13:2181/kafka -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://172.16.0.13:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -v /etc/localtime:/etc/localtime wurstmeister/kafka
参数说明:
-e KAFKA_BROKER_ID=0 在kafka集群中,每个kafka都有一个BROKER_ID来区分自己
-e KAFKA_ZOOKEEPER_CONNECT=172.16.0.13:2181/kafka 配置zookeeper管理kafka的路径172.16.0.13:2181/kafka
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://172.16.0.13:9092 把kafka的地址端口注册给zookeeper,如果是远程访问要改成外网IP,类如Java程序访问出现无法连接。
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 配置kafka的监听端口
-v /etc/localtime:/etc/localtime 容器时间同步虚拟机的时间
查看版本号
执行以下命令查看容器中的kafka版本号:
docker exec kafka-docker_kafka_1 find / -name *kafka_* | head -1 | grep -o '\kafka[^\n]*'
1
上述命令执行后,我这边控制台显示kafka_2.11-0.11.0.3,这表示Scala 的版本为2.11,kafka的版本是0.11.0.3;
2. 执行以下命令查看zookeeper版本:
docker exec kafka-docker_zookeeper_1 pwd
1
上述命令执行后,我这边控制台显示/opt/zookeeper-3.4.9,这表示zookeeper的版本为3.4.9;
5、验证kafka是否可以使用
docker exec kafka-1
kafka-topics.sh
--create --topic topic001
--partitions 4
--zookeeper 192.168.19.131:2181
--replication-factor 2
单机版
方法2
docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.19.131:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.19.131:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -v /etc/localtime:/etc/localtime wurstmeister/kafka
容器命名为kafka,指定了broker_id为0,端口号9092,zk地址为本机2181
进入kafka容器创建主题
使用docker exec –ti {$name} /bin/bash来进入指定容器
[root@imcnode228 ~] docker exec -ti kafka /bin/bash
bash-4.4# cd opt
bash-4.4# ls
kafka kafka_2.11-2.0.0 overrides
bash-4.4# cd kafka_2.11-2.0.0
bash-4.4# $KAFKA_HOME/bin/kafka-topics.sh --create --topic test --zookeeper 192.168.19.131:2181 --replication-factor 1 --partitions 1
创建一个名为test的主题,一个副本一个分区,须指定zk地址
6.收发送消息
bash-4.4# ./bin/kafka-topics.sh --zookeeper 192.168.19.131:2181 --describe --topic test
Topic: test PartitionCount: 1 ReplicationFactor: 1 Configs:
Topic: test Partition: 0 Leader: 0 Replicas: 0 Isr: 0
bash-4.4# ./bin/kafka-console-producer.sh --broker-list 192.168.19.131:9092 --topic test
testHH
testMessage1
testMessage2
q!
exit
bash-4.4# exit
[root@imcnode228 ~] docker exec -ti kafka /bin/bash
bash-4.4# cd opt
bash-4.4# ls
kafka kafka_2.11-2.0.0 overrides
bash-4.4# cd kafka_2.11-2.0.0
bash-4.4# ./bin/kafka-console-consumer.sh --bootstrap-server 192.168.19.131:9092 --topic test --from-beginning
使用kafka-console-producer.sh发送、kafka-console-consumer.sh接收消息。都需要指定broker的地址
测试结果如图所示,单机情况下能够正常收发消息,下面测试基于docker的集群搭建
参考文档地址:https://blog.csdn.net/playadota/article/details/84783825
7.搭建集群
使用docker命令可快速在同一台机器启动多个kafka,只需要改变brokerId和端口即可用于搭建集群
docker run -d --name kafka-2 -p 9093:9093 -e KAFKA_BROKER_ID=1 -e KAFKA_ZOOKEEPER_CONNECT=192.168.19.131:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.19.131:9093 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9093 -v /etc/localtime:/etc/localtime wurstmeister/kafka
启动第二个kafka容器命名为kafka-2,其zk地址与kafka1一致,broker_id为1,服务端口号为9093
然后进入kafka容器创建第二个topic名为test2,副本数2,分区2
[root@imcnode228 ~] docker exec -ti kafka /bin/bash
bash-4.4# cd opt
bash-4.4# ls
kafka kafka_2.11-2.0.0 overrides
bash-4.4# cd kafka_2.11-2.0.0
bash-4.4# $KAFKA_HOME/bin/kafka-topics.sh --create --topic test2 --zookeeper 192.168.19.131:2181 --replication-factor 2 --partitions 2
查询test2主题可以看到,已经是集群环境,可以看到leader机器、副本在分区上的保存情况,和ISR列表成员
bash-4.4# ./bin/kafka-topics.sh --zookeeper 192.168.19.131:2181 --describe --topic test2
Topic: test2 PartitionCount: 2 ReplicationFactor: 2 Configs:
Topic: test2 Partition: 0 Leader: 1 Replicas: 1,0 Isr: 1,0
Topic: test2 Partition: 1 Leader: 0 Replicas: 0,1 Isr: 0,1
8.集群收发消息
测试一下使用kafka1发送消息,kafka2接收消息
[root@imcnode228 ~] docker exec -ti kafka /bin/bash
bash-4.4# cd opt
bash-4.4# ls
kafka kafka_2.11-2.0.0 overrides
bash-4.4# cd kafka_2.11-2.0.0
bash-4.4# $KAFKA_HOME/bin/kafka-topics.sh --create --topic test2 --zookeeper 192.168.19.131:2181 --replication-factor 2 --partitions 2
bash-4.4# ./bin/kafka-topics.sh --zookeeper 192.168.19.131:2181 --describe --topic test2
bash-4.4# ./bin/kafka-console-producer.sh --broker-list 192.168.19.131:9092,192.168.19.131:9093 --topic test2
test2Message
bash-4.4# ./bin/kafka-console-consumer.sh --bootstrap-server 192.168.19.131:9092,192.168.19.131:9093 --topic test2 --from-beginning
如图所示,可以正常发送和接收
9.关闭kafka2后查看集群状态
[root@imcnode228 ~] docker stop kafka-2
[root@imcnode228 ~] docker exec -ti kafka /bin/bash
bash-4.4# cd opt
bash-4.4# ls
kafka kafka_2.11-2.0.0 overrides
bash-4.4# cd kafka_2.11-2.0.0
bash-4.4# ./bin/kafka-topics.sh --zookeeper 192.168.19.131:2181 --describe --topic test2
Topic: test2 PartitionCount: 2 ReplicationFactor: 2 Configs:
Topic: test2 Partition: 0 Leader: 0 Replicas: 1,0 Isr: 0
Topic: test2 Partition: 1 Leader: 0 Replicas: 0,1 Isr: 0
可以看到分区的leader机都变成了broker0(即kafka1),ISR列表中只有broker0
除了手动命令行搭建集群,还可以用k8s 配合yml文件快捷的搭建集群
详情见另一篇博文https://blog.csdn.net/playadota/article/details/84784073
docker 安装kafka-manager
docker run -d --name kafka-manager --link zookeeper:zookeeper --link kafka:kafka -p 9001:9000 --restart=always --env ZK_HOSTS=192.168.228.128:2181 \sheepkiller/kafka-manager
因为启动时加了参数 docker run --restart=always ,这个意思是无论容器是正常还是非正常手动关闭都会重启,
可以修改为docker run --restart=on-failure,异常关闭时重启容器。
浙公网安备 33010602011771号