一、拉取鏡像
docker pull wurstmeister/zookeeper
docker pull wurstmeister/kafka
二广辰、 啟動(dòng)容器
# 啟動(dòng)zookeeper
docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper
# 啟動(dòng)kafka 192.168.0.100改為自己機(jī)器實(shí)際IP
docker run -d --name kafka --publish 9092:9092 --link zookeeper --env KAFKA_BROKER_ID=0 --env KAFKA_ZOOKEEPER_CONNECT=192.168.0.100:2181 --env KAFKA_ADVERTISED_HOST_NAME=192.168.0.100 --env KAFKA_ADVERTISED_PORT=9092 wurstmeister/kafka
三、基礎(chǔ)命令
進(jìn)入容器
docker exec -it kafka /bin/bash
Topic創(chuàng)建
#創(chuàng)建一個(gè)名為 test 的 Topic,該 Topic 包含一個(gè)分區(qū)和一個(gè) Replica翩活。
# 進(jìn)入kafka容器中執(zhí)行
kafka-topics.sh --create --zookeeper 192.168.0.100:2181 --replication-factor 1 --partitions 1 --topic test
# 不進(jìn)入直接執(zhí)行
docker exec kafka kafka-topics.sh --create --zookeeper 192.168.0.100:2181 --replication-factor 1 --partitions 1 --topic test
Topic查詢
# 進(jìn)入kafka容器中執(zhí)行
kafka-topics.sh --list --zookeeper 192.168.0.100:2181
# 不進(jìn)入直接執(zhí)行
docker exec kafka kafka-topics.sh --list --zookeeper 192.168.0.100:2181
命令行消息生產(chǎn)者創(chuàng)建
# 進(jìn)入kafka容器中執(zhí)行
kafka-console-producer.sh --broker-list 192.168.0.100:9092 --topic test
# 不進(jìn)入直接執(zhí)行
docker exec -it kafka kafka-console-producer.sh --broker-list 192.168.0.100:9092 --topic test
命令行消息消費(fèi)者創(chuàng)建
# 進(jìn)入kafka容器中執(zhí)行
kafka-console-consumer.sh --bootstrap-server 192.168.0.100:9092 --topic test --from-beginning
# 不進(jìn)入直接執(zhí)行
docker exec -it kafka kafka-console-consumer.sh --bootstrap-server 192.168.0.100:9092 --topic test --from-beginning
Topic刪除
# 進(jìn)入kafka容器中執(zhí)行
kafka-topics.sh --zookeeper 192.168.0.100:2181 --delete --topic test
# 不進(jìn)入直接執(zhí)行
docker exec kafka kafka-topics.sh --zookeeper 192.168.0.100:2181 --delete --topic test
四、Broker集群搭建&&容錯(cuò)測(cè)試
創(chuàng)建zookeeper和三個(gè)kafka實(shí)例
docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper
docker run -d --name kafka0 -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.0.100:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.0.100:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka
docker run -d --name kafka1 -p 9093:9093 -e KAFKA_BROKER_ID=1 -e KAFKA_ZOOKEEPER_CONNECT=192.168.0.100:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.0.100:9093 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9093 -t wurstmeister/kafka
docker run -d --name kafka2 -p 9094:9094 -e KAFKA_BROKER_ID=2 -e KAFKA_ZOOKEEPER_CONNECT=192.168.0.100:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.0.100:9094 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9094 -t wurstmeister/kafka
創(chuàng)建一個(gè)擁有3副本的topic
#創(chuàng)建topic
docker exec kafka0 kafka-topics.sh --create --zookeeper 192.168.0.100:2181 --replication-factor 3 --partitions 1 --topic TestTopic
#查看topic
docker exec kafka0 kafka-topics.sh --topic TestTopic --describe --zookeeper 192.168.0.100:2181
#可以看到便贵,當(dāng)前Leader是Broker0
Topic: TestTopic PartitionCount: 1 ReplicationFactor: 3 Configs:
Topic: TestTopic Partition: 0 Leader: 0 Replicas: 0,2,1 Isr: 0,2,1
集群測(cè)試
#在Broker0上運(yùn)行一個(gè)生產(chǎn)者菠镇,Broker1、2上分別運(yùn)行一個(gè)消費(fèi)者
kafka-console-producer.sh --broker-list 192.168.0.100:9092 --topic TestTopic
kafka-console-consumer.sh --bootstrap-server 192.168.0.100:9093 --topic TestTopic --from-beginning
kafka-console-consumer.sh --bootstrap-server 192.168.0.100:9094 --topic TestTopic --from-beginning
#Broker0命令行輸入消息承璃,觀察Broker1利耍、2是否收到
容錯(cuò)測(cè)試
#在Broker0上運(yùn)行一個(gè)生產(chǎn)者,Broker1上運(yùn)行一個(gè)消費(fèi)者
kafka-console-producer.sh --broker-list 192.168.0.100:9092 --topic TestTopic
kafka-console-consumer.sh --bootstrap-server 192.168.0.100:9093 --topic TestTopic --from-beginning
#停掉Broker0盔粹,Broker2上運(yùn)行一個(gè)消費(fèi)者隘梨,觀察Broker2能否收到消息
docker stop kafka0
kafka-console-consumer.sh --bootstrap-server 192.168.0.100:9094 --topic TestTopic --from-beginning
五、docker-compose創(chuàng)建kafka集群
docker-compose-kafka-cluster.yml 文件
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
container_name: zookeeper
ports:
- "2181:2181"
kafka1:
image: wurstmeister/kafka
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 192.168.0.100
KAFKA_CREATE_TOPICS: TestComposeTopic:4:3
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_BROKER_ID: 1
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.0.100:9092
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
container_name: kafka01
volumes:
- /var/run/docker.sock:/var/run/docker.sock
kafka2:
image: wurstmeister/kafka
ports:
- "9093:9093"
environment:
KAFKA_ADVERTISED_HOST_NAME: 192.168.0.100
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_BROKER_ID: 2
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.0.100:9093
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9093
container_name: kafka02
volumes:
- /var/run/docker.sock:/var/run/docker.sock
kafka3:
image: wurstmeister/kafka
ports:
- "9094:9094"
environment:
KAFKA_ADVERTISED_HOST_NAME: 192.168.0.100
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_BROKER_ID: 3
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.0.100:9094
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9094
container_name: kafka03
volumes:
- /var/run/docker.sock:/var/run/docker.sock
啟動(dòng)命令
docker-compose -f docker-compose-kafka-cluster.yml up