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,异常关闭时重启容器。

posted on 2020-12-31 16:59  小小菜呦  阅读(605)  评论(0)    收藏  举报

导航