编辑于2017年11月28日:
Kafka在他们的配置文件中添加了listener.security.protocol.map
。这允许您根据您是否在集群内部或外部设置不同的侦听器地址和协议,并防止Kafka受到Docker中发生的任何负载平衡或IP转换的困扰。Wurstmeister有一个可用的Docker镜像和示例组合文件在这里。我以前尝试过使用一些Docker机器节点作为Swarm,它似乎可以工作。
但实际上,我现在只需要将Kafka映像附加到覆盖网络并在需要与其交互时运行Kafka控制台命令。
希望这能帮助到你。
以下是旧内容
我一直在尝试使用docker 1.12使用docker swarm模式
创建节点
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)
创建Zookeeper服务
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
尽管出于某种原因,只有从入口或用户定义的覆盖网络中才能正常工作,如果尝试通过其中一台客户机连接到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中的新Mesh网络和负载均衡可能会影响Kafka连接......
为了获取主机容器,我有一个本地运行的Flask应用程序,可以通过curl访问。
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/')
def hello_world():
return request.remote_addr