天天看點

kafka的Docker鏡像使用說明(wurstmeister/kafka)

在hub.docker.com網站上,Star最多的kafka鏡像是wurstmeister/kafka,今天一起來實踐這個鏡像,使用此鏡像搭建kafka環境,并且生産和消費消息;

實戰環境

  1. 作業系統:CentOS7
  2. Docker:17.03.2-ce
  3. docker-compose:1.23.2

編寫docker-compose.yml

wurstmeister在github開源了一份docker-compose.yml,在使用中遇到以下兩個問題:

  1. kafka的配置使用了參數"build: .",是以啟動時會在本地建構鏡像,建構過程中有的網站通路逾時,導緻鏡像建構失敗;
  2. 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:2.11-0.11.0.3
    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

  1. 在docker-compose.yml所在的檔案夾下,執行指令docker-compose up -d,會先下載下傳zookeeper和kafka的鏡像,然後建立容器;
  2. 執行指令docker ps,可見啟動了一個zookeeper和一個kafka容器:
[root@hedy kafka-docker]# docker ps
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                                                NAMES
ac99c60be2e3        wurstmeister/kafka:2.11-0.11.0.3   "start-kafka.sh"         5 seconds ago       Up 3 seconds        0.0.0.0:32773->9092/tcp                              kafka-docker_kafka_1
0a26b6c4119e        wurstmeister/zookeeper             "/bin/sh -c '/usr/..."   5 seconds ago       Up 3 seconds        22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp   kafka-docker_zookeeper_1           

複制

  1. 由上面的指令可知kafka容器名稱是kafka-docker_kafka_1,zookeeper容器名稱是kafka-docker_zookeeper_1;

檢視版本号

  1. 執行以下指令檢視容器中的kafka版本号:
docker exec kafka-docker_kafka_1 find / -name \*kafka_\* | head -1 | grep -o '\kafka[^\n]*'           

複制

上述指令執行後,我這邊控制台顯示kafka_2.11-0.11.0.3,這表示Scala 的版本為2.11,kafka的版本是0.11.0.3;

2. 執行以下指令檢視zookeeper版本:

docker exec kafka-docker_zookeeper_1 pwd           

複制

上述指令執行後,我這邊控制台顯示/opt/zookeeper-3.4.9,這表示zookeeper的版本為3.4.9;

擴充broker

  1. 在docker-compose.yml所在的檔案夾下,執行以下指令即可将borker總數從1個擴充到4個:
docker-compose scale kafka=4           

複制

  1. 執行指令docker ps,可見kafka容器已經擴充到4個:
[root@hedy 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

  1. 建立一個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           

複制

  1. 執行以下指令檢視剛剛建立的topic,這次在容器kafka-docker_kafka_3上執行指令試試:
[root@hedy kafka-docker]# docker exec kafka-docker_kafka_3 \
kafka-topics.sh --list \
--zookeeper zookeeper:2181 \
topic001           

複制

可見剛剛建立的topic可以被查到;

3. 檢視剛剛建立的topic的情況,borker和副本情況一目了然,如下:

[root@hedy 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           

複制

目前還沒有生産消息,是以控制台不會有内容輸出,接下來嘗試生産消息;

生産消息

  1. 打開一個新的視窗,執行如下指令,進入生産消息的指令行模式,注意不要漏掉參數"-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           

複制

  1. 現在已經進入了生産消息的指令行模式,輸入一些字元串然後回車,再去消費消息的控制台視窗看看,已經有消息列印出來,說明消息的生産和消費都成功了;

至此,鏡像wurstmeister/kafka的實戰就完成了,在後續使用到kafka服務的時候,可以參考本次實戰快速搭建kafka叢集;