当前位置: 代码网 > 服务器>服务器>云虚拟主机 > 如何用docker部署kafka

如何用docker部署kafka

2024年10月28日 云虚拟主机 我要评论
摘抄引用docker镜像选型kafka是没有官方docker镜像的,所以要么自己写一个dockerfile,要么用第三方已经构建好的。自己写一个dockerfile不是不可以,但不符合我要&ldquo

摘抄引用

docker镜像选型

kafka是没有官方docker镜像的,所以要么自己写一个dockerfile,要么用第三方已经构建好的。

自己写一个dockerfile不是不可以,但不符合我要“最快”的目标,所以用第三方已经构建好的镜像那是最快的。

由于是第三方镜像,希望已经用过的人越多越好,这样坑相对会比较少一些。

带着上面的要求,开始寻找合适的第三方镜像,比较出名的有以下几个:

  1. wurstmeister/kafka特点:star数最多,版本更新到 kafka 1.0,zookeeper与kafka分开于不同镜像。
  2. spotify/kafka特点:star数较多,有很多文章或教程推荐,zookeeper与kafka置于同一镜像中;但kafka版本较老(还停留在0.10.1.0)。
  3. confluent/kafka背景:confluent是书中提到的哪位开发kafka的jay kreps从linkedln离职后创立的新公司,confluent platform是一个流数据平台,围绕kafka打造了一系列的产品。特点:大咖操刀,文档详尽,但是也和confluent platform进行了捆绑。

上述三个项目中,最终选定使用wurstmeister/kafka,star最多,版本一直保持更新,用起来应该比较放心。

wurstmeister/kafka镜像简介的先决条件

  • 安装docker-compose
  • docker-compose.yml配置文件中修改kafka_advertised_host_name去匹配你的docker主机ip(注意:如果你想要运行多broker集群,不要使用localhost127.0.0.1作为主机ip)
  • 如果你想要添加自定义的kafka参数,只需要将它们添加到docker-compose.yml。例如:
    • 增加message.max.bytes参数,添加kafka_message_max_bytes: 2000000environment部分。
    • 关闭自动主题创建集,配置kafka_auto_create_topics_enable: 'false'
  • kafka可以通过添加环境变量前缀log4j_来自定义log4j用法。这些环境变量会映射到log4j.properties。例如:log4j_logger_kafka-authorizer_logger=debug,authorizerappender

**注意:**配置网络有几个“问题”。如果你不知道的要求是什么,请查看连接指南

简单使用

启动集群:

  • docker-compose up -d

添加更多brokers

  • docker-compose scale kafka=3

销毁一个集群

  • docker-compose stop

安装过程

1. 安装docker(略)

2. 安装docker compose(略)

3. 从github拉取最新打包资源

# 克隆docker制作脚本
git clone https://github.com/wurstmeister/kafka-docker.git

# 进入目录查看目录文件
cd kafka-docker

# 查看所有标签,找到最新版本
git tag

# 切换到最新版本
git checkout <last_tag_name>

kafka-docker仓库目录文件展示:

[root@jiewli kafka-docker]# ll
总用量 72
-rwxr-xr-x. 1 root root   210 7月   7 17:18 broker-list.sh
-rw-r--r--. 1 root root   969 7月   7 17:18 changelog.md
-rwxr-xr-x. 1 root root  1221 7月   7 17:18 create-topics.sh
-rw-r--r--. 1 root root   367 7月   7 17:08 docker-compose-single-broker.yml
-rw-r--r--. 1 root root   705 7月   7 17:08 docker-compose-swarm.yml
-rw-r--r--. 1 root root   324 7月   7 17:18 docker-compose.yml
-rw-r--r--. 1 root root  1132 7月   7 17:18 dockerfile
-rwxr-xr-x. 1 root root   395 7月   7 17:18 download-kafka.sh
-rw-r--r--. 1 root root 11325 7月   7 17:08 license
-rw-r--r--. 1 root root  9887 7月   7 17:18 readme.md
-rwxr-xr-x. 1 root root  4591 7月   7 17:18 start-kafka.sh
-rwxr-xr-x. 1 root root   131 7月   7 17:08 start-kafka-shell.sh
drwxr-xr-x. 2 root root  4096 7月   7 17:18 test

4. 更新docker-compose.yml中你docker主机ip

通过命令vim docker-compose.yml查看仓库目录中的docker-compose.yml配置文件。

version: '2'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    build: .
    ports:
      - "9092"
    environment:
      docker_api_version: 1.22
      kafka_advertised_host_name: 192.168.99.100
      kafka_zookeeper_connect: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

重要:

kafka 0.9.x以后的版本新增了advertised.listeners配置

kafka 0.9.x以后的版本不要使用 advertised.host.nameadvertised.host.port 已经 deprecated
 

host.nameport 为 deprecated,使用 listeners 代替

所以,kafka_advertised_host_name配置也要改成 kafka_advertised_listeners, 而后者要求必须配置 kafka_listeners,不然会抛异常:

error: missing environment variable kafka_listeners. must be specified when using kafka_advertised_listeners

version: '2'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    build: .
    ports:
      - "9092"
    environment:
      docker_api_version: 1.22
      kafka_listeners: plaintext://:9092
      kafka_advertised_listeners: plaintext://192.168.99.100:9094
      kafka_zookeeper_connect: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

将上面kafka_advertised_host_name改为你的docker主机ip。

如果你想要添加自定义的kafka参数,只需要将它们添加到docker-compose.yml。例如:

  • 增加message.max.bytes参数,添加kafka_message_max_bytes: 2000000environment部分。
  • 关闭自动主题创建集,配置kafka_auto_create_topics_enable: 'false'

启动失败:

[root@jiewli kafka-docker]# docker logs -f --tail=300 kafka-docker_kafka_1
error: missing environment variable kafka_listeners. must be specified when using kafka_advertised_listeners
error: missing environment variable kafka_listeners. must be specified when using kafka_advertised_listeners
error: missing environment variable kafka_listeners. must be specified when using kafka_advertised_listeners
error: missing environment variable kafka_listeners. must be specified when using kafka_advertised_listeners
error: missing environment variable kafka_listeners. must be specified when using kafka_advertised_listeners
error: missing environment variable kafka_listeners. must be specified when using kafka_advertised_listeners
error: missing environment variable kafka_listeners. must be specified when using kafka_advertised_listeners
error: missing environment variable kafka_listeners. must be specified when using kafka_advertised_listeners
error: missing environment variable kafka_listeners. must be specified when using kafka_advertised_listeners

5. 启动集群

$ docker-compose up -d

例如,启动一个有两个broker的的集群

$ docker-compose scale kafka=2

这会启动一个单独的zookeeper实例,和两个kafka实例。你可以使用docker-compose ps命令去显示正在运行的实例。

如果你想去添加更多的kafka brokers,只需要通过命令docker-compose scale kafka=n增加值。

5.1 当执行docker-compose -f docker-compose.yml up -d命令遇到错误

wget: server returned error: http/1.1 404 not found
the command '/bin/sh -c apk add --no-cache bash curl jq docker  && mkdir /opt  && chmod a+x /tmp/*.sh  && mv /tmp/start-kafka.sh /tmp/broker-list.sh /tmp/create-topics.sh /usr/bin  && sync && /tmp/download-kafka.sh  && tar xfz /tmp/kafka_${scala_version}-${kafka_version}.tgz -c /opt  && rm /tmp/kafka_${scala_version}-${kafka_version}.tgz  && ln -s /opt/kafka_${scala_version}-${kafka_version} /opt/kafka  && rm /tmp/*  && wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${glibc_version}/glibc-${glibc_version}.apk  && apk add --no-cache --allow-untrusted glibc-${glibc_version}.apk  && rm glibc-${glibc_version}.apk' returned a non-zero code: 1
error: service 'kafka' failed to build

根据提示,是wget命令下载某个文件的时候遇到了404。

5.2 分析脚本执行过程

dockerfilerun指令中可以找到:

经过一番排查,最终定位到download-kafka.sh这个脚本中的wget命令,我增加一行echo命令,将整个wget命令打印出来看看:

# echo打印结果
wget -q "https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/1.1.0/kafka_2.12-1.1.0.tgz" -o "/tmp/kafka_2.12-1.1.0.tgz"

根据链接查找这个文件,发现是在“清华大学开源软件镜像站”中下载的,但是1.1.0这个目录都没有了,取而代之的是2.x.x的目录了。

下载不了,很明显这个版本太落后了。一看仓库git-tag的创建时间居然是2018年,已经三年多没有发布新的tag版本了。

5.3 使用master分支的构建脚本启动2.x.x版本的kafka

那么回到master分支看看,一看最新提交,2021年6月有提交过。仔细研究了一下master分支的脚本和dockerfile,其实作者早已经将kafka版本调整到2.x.x,并且修改了下载地址。

那么切换到master分支后,重新使用命令$ docker-compose up -d启动kafka集群就可以了。

6. 开启单个节点

docker-compose -f docker-compose-single-broker.yml up -d

开启容器如下所示:

[root@jiewli ~]# docker ps
container id   image                       command                  created         status       ports                                                names
43fb3efd832f   kafka-docker_kafka          "start-kafka.sh"         24 hours ago    up 4 hours   0.0.0.0:9092->9092/tcp                               kafka-docker_kafka_1
b8bc06090259   wurstmeister/zookeeper      "/bin/sh -c '/usr/sb…"   24 hours ago    up 4 hours   22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp   kafka-docker_zookeeper_1

kafka shell

进入docker容器交互命令行

docker exec -it kafka-docker_kafka_1 /bin/bash

查看 kafka 安装目录,找到脚本位置

bash-5.1# echo $kafka_home
/opt/kafka
bash-5.1# cd $kafka_home
bash-5.1# ls
license    notice     bin        config     libs       licenses   logs       site-docs

默认情况下,kafka 安装目录是 /opt/kafka

你可以通过kafka shell与你的kafka集群进行交互。

$ $kafka_home/bin/start-kafka-shell.sh <docker_host_ip> <zk_host:zk_port>

测试

测试你的安装步骤。

启动一个shell终端,创建一个topic和启动一个生产者。

$ $kafka_home/bin/kafka-topics.sh --create --topic topic \
--partitions 4 --zookeeper $zk --replication-factor 2

$ $kafka_home/bin/kafka-topics.sh --describe --topic topic --zookeeper $zk

$ $kafka_home/bin/kafka-console-producer.sh --topic=topic \
--broker-list=`broker-list.sh`

启动另一个shell终端,并启动一个消费者。

$ $kafka_home/bin/kafka-console-consumer.sh --topic=topic --zookeeper=$zk

在mac电脑上运行kafka-docker

安装docker toolbox,并将docker-machine ip命令返回的ip配置到kafka_advertised_host_name

故障排除

  • 默认情况下,kafka broker使用1gb内存,因此如果您在启动代理是遇到问题,请检查docker-compose logs/docker logs查找容器并确保主机上有足够的可用内存。
  • 如果要运行多个broker,请不要使用localhost127.0.0.1作为主机ip,否则broker将无法通信。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com