kafka的Docker映象使用說明(wurstmeister/kafka)
阿新 • • 發佈:2018-12-31
在hub.docker.com網站上,Star最多的kafka映象是wurstmeister/kafka,今天一起來實踐這個映象,使用此映象搭建kafka環境,並且生產和消費訊息;
實戰環境
- 作業系統:CentOS7
- Docker:17.03.2-ce
- docker-compose:1.23.2
編寫docker-compose.yml
wurstmeister在github開源了一份docker-compose.yml,在使用中遇到以下兩個問題:
- kafka的配置使用了引數"build: .",因此啟動時會在本地構建映象,構建過程中有的網站訪問超時,導致映象構建失敗;
- docker-compose.yml中環境變數的配置,在消費訊息時會出現異常"LEADER_NOT_AVAILABLE";
針對上述問題,我對原有的docker-compose.yml做了修改和調整,本次實戰用到的docker-compose.yml內容如下:
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
ports:
- "9092"
environment:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://:9092
KAFKA_LISTENERS: PLAINTEXT://:9092
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock:/var/run/docker.sock
啟動server
- 在docker-compose.yml所在的資料夾下,執行命令docker-compose up -d,會先下載zookeeper和kafka的映象,然後建立容器;
- 執行命令docker ps,可見啟動了一個zookeeper和一個kafka容器:
[[email protected] kafka-docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19bc31339915 wurstmeister/zookeeper "/bin/sh -c '/usr/..." 31 seconds ago Up 29 seconds 22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp kafka-docker_zookeeper_1
11bbf5c6ebec kafka-docker_kafka "start-kafka.sh" 31 seconds ago Up 29 seconds 0.0.0.0:32768->9092/tcp kafka-docker_kafka_1
- 由上面的命令可知kafka容器名稱是kafka-docker_kafka_1,zookeeper容器名稱是kafka-docker_zookeeper_1;
檢視版本號
- 執行以下命令檢視容器中的kafka版本號:
docker exec kafka-docker_kafka_1 find / -name \*kafka_\* | head -1 | grep -o '\kafka[^\n]*'
上述命令執行後,我這邊控制檯顯示kafka_2.12-2.1.0,這表示Scala 的版本為2.12,kafka的版本是2.1.0;
2. 執行以下命令檢視zookeeper版本:
docker exec kafka-docker_zookeeper_1 pwd
上述命令執行後,我這邊控制檯顯示/opt/zookeeper-3.4.9,這表示zookeeper的版本為3.4.9;
擴充套件broker
- 在docker-compose.yml所在的資料夾下,執行以下命令即可將borker總數從1個擴充套件到4個:
docker-compose scale kafka=4
- 執行命令docker ps,可見kafka容器已經擴充套件到4個:
[[email protected] kafka-docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
adf18015a95e kafka-docker_kafka "start-kafka.sh" 6 seconds ago Up 3 seconds 0.0.0.0:32771->9092/tcp kafka-docker_kafka_2
d7eb1a9c9c72 kafka-docker_kafka "start-kafka.sh" 6 seconds ago Up 3 seconds 0.0.0.0:32770->9092/tcp kafka-docker_kafka_4
0dddf1728ebd kafka-docker_kafka "start-kafka.sh" 6 seconds ago Up 4 seconds 0.0.0.0:32769->9092/tcp kafka-docker_kafka_3
19bc31339915 wurstmeister/zookeeper "/bin/sh -c '/usr/..." 23 minutes ago Up 23 minutes 22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp kafka-docker_zookeeper_1
11bbf5c6ebec kafka-docker_kafka "start-kafka.sh" 23 minutes ago Up 23 minutes 0.0.0.0:32768->9092/tcp kafka-docker_kafka_1
接下來實戰訊息的生產和消費;
建立topic
- 建立一個topic,名為topic001,4個partition,副本因子2,執行以下命令即可:
docker exec kafka-docker_kafka_1 \
kafka-topics.sh \
--create --topic topic001 \
--partitions 4 \
--zookeeper zookeeper:2181 \
--replication-factor 2
- 執行以下命令檢視剛剛建立的topic,這次在容器kafka-docker_kafka_3上執行命令試試:
[[email protected] kafka-docker]# docker exec kafka-docker_kafka_3 \
kafka-topics.sh --list \
--zookeeper zookeeper:2181 \
topic001
可見剛剛建立的topic可以被查到;
3. 檢視剛剛建立的topic的情況,borker和副本情況一目瞭然,如下:
[[email protected] kafka-docker]# docker exec kafka-docker_kafka_3 \
> kafka-topics.sh \
> --describe \
> --topic topic001 \
> --zookeeper zookeeper:2181
Topic:topic001 PartitionCount:4 ReplicationFactor:2 Configs:
Topic: topic001 Partition: 0 Leader: 1002 Replicas: 1002,1003 Isr: 1002,1003
Topic: topic001 Partition: 1 Leader: 1003 Replicas: 1003,1004 Isr: 1003,1004
Topic: topic001 Partition: 2 Leader: 1004 Replicas: 1004,1001 Isr: 1004,1001
Topic: topic001 Partition: 3 Leader: 1001 Replicas: 1001,1002 Isr: 1001,1002
消費訊息
執行如下命令,即可進入等待topic為topic001訊息的狀態:
docker exec kafka-docker_kafka_2 \
kafka-console-consumer.sh \
--topic topic001 \
--bootstrap-server kafka-docker_kafka_1:9092,kafka-docker_kafka_2:9092,kafka-docker_kafka_3:9092,kafka-docker_kafka_4:9092
目前還沒有生產訊息,因此控制檯不會有內容輸出,接下來嘗試生產訊息;
生產訊息
- 開啟一個新的視窗,執行如下命令,進入生產訊息的命令列模式,注意不要漏掉引數"-it",我之前就是因為漏掉了引數"-it",導致生產的訊息時雖然不提示異常,但是始終無法消費到訊息:
docker exec -it kafka-docker_kafka_1 \
kafka-console-producer.sh \
--topic topic001 \
--broker-list kafka-docker_kafka_1:9092,kafka-docker_kafka_2:9092,kafka-docker_kafka_3:9092,kafka-docker_kafka_4:9092
- 現在已經進入了生產訊息的命令列模式,輸入一些字串然後回車,再去消費訊息的控制檯視窗看看,已經有訊息打印出來,說明訊息的生產和消費都成功了;
至此,映象wurstmeister/kafka的實戰就完成了,在後續使用到kafka服務的時候,可以參考本次實戰快速搭建kafka叢集;