我为 Kafka 找到了这个 docker 镜像
https://hub.docker.com/r/spotify/kafka/
我可以使用链接中记录的命令轻松创建 docker 容器
docker run -p 2181:2181 -p 9092:9092 --env ADVERTISED_HOST=`boot2docker ip` --env ADVERTISED_PORT=9092 spotify/kafka
这很好。但我想配置一个在 docker swarm 上运行的“多”节点 Kafka 集群。
我该怎么做?
最佳答案
2017 年 11 月 28 日编辑:
Kafka 将 listener.security.protocol.map
添加到他们的 config .这允许您根据您是在集群内部还是外部设置不同的监听器地址和协议(protocol),并防止 Kafka 被 docker 中发生的任何负载平衡或 IP 转换弄糊涂。 Wurstmeister has a working docker image和示例 compose file here .前段时间我尝试了这个,将几个 docker 机器节点设置为一个集群,它似乎可以工作。
虽然我只是将 Kafka 图像附加到覆盖网络并在我现在想与之交互时运行 Kafka 控制台命令。
希望有帮助
下面的旧东西
我一直在使用 docker swarm 模式在 docker 1.12 上尝试这个
创建节点
docker-machine create -d virtualbox master
docker-machine create -d virtualbox worker
master_config=$(docker-machine config master | tr -d '\"')
worker_config=$(docker-machine config worker | tr -d '\"')
master_ip=$(docker-machine ip master)
docker $master_config swarm init --advertise-addr $master_ip --listen-addr $master_ip:2377
worker_token=$(docker $master_config swarm join-token worker -q)
docker $worker_config swarm join --token $worker_token $master_ip:2377
eval $(docker-machine env master)
创建动物园管理员服务
docker service create --name zookeeper \
--constraint 'node.role == manager' \
-p 2181:2181 \
wurstmeister/zookeeper
创建 kafka 服务
docker service create --name kafka \
--mode global \
-e 'KAFKA_PORT=9092' \
-e 'KAFKA_ADVERTISED_PORT=9092' \
-e 'KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092' \
-e 'KAFKA_ZOOKEEPER_CONNECT=tasks.zookeeper:2181' \
-e "HOSTNAME_COMMAND=ip r | awk '{ ip[\$3] = \$NF } END { print ( ip[\"eth0\"] ) }'" \
--publish '9092:9092' \
wurstmeister/kafka
尽管出于某种原因,这只能在入口或用户定义的覆盖网络中工作,如果您尝试通过其中一台 guest 计算机连接到 Kafka,则与 Kafka 的连接将中断。
更改公布的 IP 并没有让事情变得更好......
docker service create --name kafka \
--mode global \
-e 'KAFKA_PORT=9092' \
-e 'KAFKA_ADVERTISED_PORT=9092' \
-e 'KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092' \
-e 'KAFKA_ZOOKEEPER_CONNECT=tasks.zookeeper:2181' \
-e 'KAFKA_LOG_DIRS=/kafka/kafka-logs' \
-e "HOSTNAME_COMMAND=curl 192.168.99.1:5000" \
--publish '9092:9092' \
wurstmeister/kafka
我认为 docker 中的新网状网络和负载平衡可能会以某种方式干扰 Kafka 连接......
为了获取主机容器,我在本地运行了一个 flask 应用程序,我 curl
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/')
def hello_world():
return request.remote_addr
关于docker - 在 docker swarm 上搭建多节点 Kafka 集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37428269/