写点什么

kafka 的 Docker 镜像使用说明 (wurstmeister/kafka)

作者:程序员欣宸
  • 2022 年 7 月 25 日
  • 本文字数:2988 字

    阅读完需:约 10 分钟

kafka的Docker镜像使用说明(wurstmeister/kafka)

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos


  • 在 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,在使用中遇到以下两个问题:

  • kafka 的配置使用了参数"build: .",因此启动时会在本地构建镜像,构建过程中有的网站访问超时,导致镜像构建失败;


  1. 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
复制代码


  • 上面有个数据卷参数**/var/run/docker.sock**,这是个很重要的参数,使得容器内可以执行 docker ps、docker port 等命令,得到的结果和在宿主机上执行一样,详情请参考《docker的/var/run/docker.sock参数》

启动 server

  • 在 docker-compose.yml 所在的文件夹下,执行命令 docker-compose up -d,会先下载 zookeeper 和 kafka 的镜像,然后创建容器;

  • 执行命令 docker ps,可见启动了一个 zookeeper 和一个 kafka 容器:


[root@hedy kafka-docker]# docker psCONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                                                NAMESac99c60be2e3        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_10a26b6c4119e        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
复制代码


  • 由上面的命令可知 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.11-0.11.0.3,这表示 Scala 的版本为 2.11,kafka 的版本是 0.11.0.3;

  • 执行以下命令查看 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 个:


[root@hedy kafka-docker]# docker psCONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                                                NAMESadf18015a95e        kafka-docker_kafka       "start-kafka.sh"         6 seconds ago       Up 3 seconds        0.0.0.0:32771->9092/tcp                              kafka-docker_kafka_2d7eb1a9c9c72        kafka-docker_kafka       "start-kafka.sh"         6 seconds ago       Up 3 seconds        0.0.0.0:32770->9092/tcp                              kafka-docker_kafka_40dddf1728ebd        kafka-docker_kafka       "start-kafka.sh"         6 seconds ago       Up 4 seconds        0.0.0.0:32769->9092/tcp                              kafka-docker_kafka_319bc31339915        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_111bbf5c6ebec        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 上执行命令试试:


[root@hedy kafka-docker]# docker exec kafka-docker_kafka_3 \kafka-topics.sh --list \--zookeeper zookeeper:2181 \topic001
复制代码


  • 可见刚刚创建的 topic 可以被查到;

  • 查看刚刚创建的 topic 的情况,borker 和副本情况一目了然,如下:


[root@hedy kafka-docker]# docker exec kafka-docker_kafka_3 \> kafka-topics.sh \> --describe \> --topic topic001 \> --zookeeper zookeeper:2181Topic: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 集群;

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

发布于: 8 小时前阅读数: 13
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018.04.19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
kafka的Docker镜像使用说明(wurstmeister/kafka)_kafka_程序员欣宸_InfoQ写作社区