章节目录
Kafka是没有官方Docker镜像的,所以要么自己写一个Dockerfile,要么用第三方已经构建好的。
自己写一个Dockerfile不是不可以,但不符合我要“最快”的目标,所以用第三方已经构建好的镜像那是最快的。
由于是第三方镜像,希望已经用过的人越多越好,这样坑相对会比较少一些。
带着上面的要求,开始寻找合适的第三方镜像,比较出名的有以下几个:
wurstmeister/kafka特点:star数最多,版本更新到 Kafka 1.0,zookeeper与kafka分开于不同镜像。spotify/kafka特点:star数较多,有很多文章或教程推荐,zookeeper与kafka置于同一镜像中;但kafka版本较老(还停留在0.10.1.0)。confluent/kafka背景:Confluent是书中提到的哪位开发Kafka的Jay Kreps从LinkedLn离职后创立的新公司,Confluent Platform是一个流数据平台,围绕Kafka打造了一系列的产品。特点:大咖操刀,文档详尽,但是也和Confluent Platform进行了捆绑。上述三个项目中,最终选定使用wurstmeister/kafka,star最多,版本一直保持更新,用起来应该比较放心。
wurstmeister/kafka镜像简介的先决条件docker-composedocker-compose.yml配置文件中修改KAFKA_ADVERTISED_HOST_NAME去匹配你的docker主机IP(注意:如果你想要运行多broker集群,不要使用localhost或127.0.0.1作为主机ip)docker-compose.yml。例如:
message.max.bytes参数,添加KAFKA_MESSAGE_MAX_BYTES: 2000000到environment部分。KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'false'LOG4J_来自定义log4j用法。这些环境变量会映射到log4j.properties。例如:LOG4J_LOGGER_KAFKA-AUTHORIZER_LOGGER=DEBUG,authorizerAppender**注意:**配置网络有几个“问题”。如果你不知道的要求是什么,请查看连接指南
启动集群:
docker-compose up -d添加更多brokers
docker-compose scale kafka=3销毁一个集群
docker-compose stop# 克隆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
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.name和advertised.host.port已经 deprecated
host.name和port为 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: 2000000到environment部分。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
$ docker-compose up -d
例如,启动一个有两个broker的的集群
$ docker-compose scale kafka=2
这会启动一个单独的zookeeper实例,和两个Kafka实例。你可以使用docker-compose ps命令去显示正在运行的实例。
如果你想去添加更多的Kafka brokers,只需要通过命令docker-compose scale kafka=n增加值。
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。
从Dockerfile的RUN指令中可以找到:

经过一番排查,最终定位到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版本了。
2.x.x版本的kafka那么回到master分支看看,一看最新提交,2021年6月有提交过。仔细研究了一下master分支的脚本和Dockerfile,其实作者早已经将kafka版本调整到2.x.x,并且修改了下载地址。
那么切换到master分支后,重新使用命令$ docker-compose up -d启动kafka集群就可以了。
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
进入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
安装Docker Toolbox,并将docker-machine ip命令返回的ip配置到KAFKA_ADVERTISED_HOST_NAME
docker-compose logs/docker logs查找容器并确保主机上有足够的可用内存。localhost或127.0.0.1作为主机IP,否则broker将无法通信。我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
我可以在Azure网站上部署RubyonRails吗? 最佳答案 还没有。目前仅支持.NET和PHP。 关于ruby-on-rails-RubyonRails可以部署在Azure网站上吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/12964010/
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
前置步骤我们都操作完了,这篇开始介绍jenkins的集成。话不多说,看操作1、登录进入jenkins后会让你选择安装插件,选择第一个默认的就行。安装完成后设置账号密码,重新登录。2、配置JDK和Git都需要执行路径,所以需要先把执行路径找到,先进入服务器的docker容器,2.1JDK的路径root@69eef9ee86cf:/usr/bin#echo$JAVA_HOME/usr/local/openjdk-82.2Git的路径root@69eef9ee86cf:/#whichgit/usr/bin/git3、先配置JDK和Git。点击:ManageJenkins>>GlobalToolCon
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
Ocra无法处理需要“tk”的应用程序require'tk'puts'nope'用奥克拉http://github.com/larsch/ocra不起作用(如链接中的一个问题所述)问题:https://github.com/larsch/ocra/issues/29(Ocra是1.9的"new"rubyscript2exe,本质上它用于将rb脚本部署为可执行文件)唯一的问题似乎是缺少tcl的DLL文件我不认为这是一个问题据我所知,问题是缺少tk的DLL文件如果它们是已知的,则可以在执行ocra时将它们包括在内有没有办法知道tk工作所需的DLL依赖项? 最佳答
我有一个类unzipper.rb,它使用Rubyzip解压文件。在我的本地环境中,我可以成功解压缩文件,而无需使用require'zip'明确包含依赖项但是在Heroku上,我得到一个NameError(uninitializedconstantUnzipper::Zip)我只能通过使用明确的require来解决问题:为什么这在Heroku环境中是必需的,但在本地主机上却不是?我的印象是Rails自动需要所有gem。app/services/unzipper.rbrequire'zip'#OnlyrequiredforHeroku.Workslocallywithout!class
出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t
我正在尝试使用docker运行一个Rails应用程序。通过github的sshurl安装的gem很少,如下所示:Gemfilegem'swagger-docs',:git=>'git@github.com:xyz/swagger-docs.git',:branch=>'my_branch'我在docker中添加了keys,它能够克隆所需的repo并从git安装gem。DockerfileRUNmkdir-p/root/.sshCOPY./id_rsa/root/.ssh/id_rsaRUNchmod700/root/.ssh/id_rsaRUNssh-keygen-f/root/.ss
如何使用Capistrano将Rails应用程序部署到无法访问外部网络或存储库的生产或暂存服务器?我已经设法完成部署的一半,并意识到Capistrano没有在我的本地机器上下载gitrepo,但它首先连接到远程服务器并尝试在那里下载Git存储库。我希望有一个类似Javaee的构建系统,其中创建可交付成果并将该可交付成果发送到服务器。就像您构建.ear文件并将其部署到您想要的任何服务器上一样。显然在RoR中,你被迫(据我所知)在该服务器上构建应用程序,在那里创建一个gem存储库,在那里克隆最新的分支等等。有什么方法可以将准备运行的包发送到远程服务器吗? 最佳答