在hub.docker.com网站上,Star最多的kafka镜像是wurstmeister/kafka,今天一起来实践这个镜像,使用此镜像搭建kafka环境,并且生产和消费消息;
wurstmeister在github开源了一份docker-compose.yml,在使用中遇到以下两个问题:
针对上述问题,我对原有的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
上面有个数据卷参数/var/run/docker.sock,这是个很重要的参数,使得容器内可以执行docker ps、docker port等命令,得到的结果和在宿主机上执行一样,详情请参考《docker的/var/run/docker.sock参数》。
[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
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;
docker-compose scale 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
接下来实战消息的生产和消费;
docker exec kafka-docker_kafka_1 \
kafka-topics.sh \
--create --topic topic001 \
--partitions 4 \
--zookeeper zookeeper:2181 \
--replication-factor 2
[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
目前还没有生产消息,因此控制台不会有内容输出,接下来尝试生产消息;
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集群;