我想用 wurstmeister\kafka-docker
图像 docker-compose
,但我在连接所有东西时遇到了真正的问题。
所有的帖子或问题,我检查,似乎没有任何问题,但我坦率地说,失去了(至少有两个问题,以便尝试解决这个问题)
我认为问题是我对网络的理解不够 docker
. 所以问题是:
我可以使用kafka的同一个容器进行消费和生产,但是,当我尝试创建另一个容器(或者将我的笔记本电脑与python客户机一起使用)时,出现了几个与 advertised.host.name
参数(在图像中,此参数为 KAFKA_ADVERTISED_HOST_NAME
)
我已经尝试了很多方法来设置这个变量,但它根本不起作用。
因此,我正在寻找一个权威的答案(即如何自动设置这些参数和它的意义)如何设置 docker-compose.yml
这是我的:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
# hostname: kafka
ports:
- "9092"
links:
- zookeeper:zk
environment:
KAFKA_ADVERTISED_HOST_NAME: "kafka"
KAFKA_ADVERTISED_PORT: "9092"
KAFKA_ZOOKEEPER_CONNECT: "zk:2181"
更新
按照@dnephin的建议,我修改了 start-kafka.sh
在以下行中:
...
if [[ -z "$KAFKA_ADVERTISED_PORT" ]]; then
export KAFKA_ADVERTISED_PORT=$(hostname -i)
fi
...
并移除 KAFKA_ADVERTISED_HOST_NAME: "kafka"
从 docker-compose.yml
我以规范的方式开始容器:
docker-compose up -d
两个容器都在运行:
$ docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------------------------------
infraestructura_kafka_1 start-kafka.sh Up 0.0.0.0:32768->9092/tcp
infraestructura_zookeeper_1 /opt/zookeeper/bin/zkServe ... Up 0.0.0.0:2181->2181/tcp, 2888/tcp, 3888/tcp
后来我做了:
docker-compose logs
一切都很顺利。
检查ip地址:
$ KAFKA_IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' infraestructura_kafka_1)
$ echo $KAFKA_IP
172.17.0.4
and
$ ZK_IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' infraestructura_zookeeper_1)
$ echo $ZK_IP
172.17.0.3
然后我在两个不同的控制台中执行:
制片人:
$ docker run --rm --interactive wurstmeister/kafka /opt/kafka_2.11-0.9.0.1/bin/kafka-console-producer.sh --topic grillo --broker-list 171.17.0.4:9092
消费者:
$ docker run --rm --interactive wurstmeister/kafka /opt/kafka_2.11-0.9.0.1/bin/kafka-console-consumer.sh --topic grillo --from-beginning --zookeeper 172.17.0.3:2181
几乎立刻,警告开始在整个屏幕上飞来飞去:
[2016-03-11 00:39:17,010] WARN Fetching topic metadata with correlation id 0 for topics [Set(grillo)] from broker [BrokerEndPoint(1001,ba53d4fd7595,9092)] failed (kafka.client.ClientUtils$)
java.nio.channels.ClosedChannelException
at kafka.network.BlockingChannel.send(BlockingChannel.scala:110)
at kafka.producer.SyncProducer.liftedTree1$1(SyncProducer.scala:75)
at kafka.producer.SyncProducer.kafka$producer$SyncProducer$$doSend(SyncProducer.scala:74)
at kafka.producer.SyncProducer.send(SyncProducer.scala:119)
at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:59)
at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:94)
at kafka.consumer.ConsumerFetcherManager$LeaderFinderThread.doWork(ConsumerFetcherManager.scala:66)
at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:63)
[2016-03-11 00:39:17,013] WARN [console-consumer-79688_9dd5f575d557-1457656747003-f1ed369d-leader-finder-thread], Failed to find leader for Set([grillo,0]) (kafka.consumer.ConsumerFetcherManager$LeaderFin
derThread)
kafka.common.KafkaException: fetching topic metadata for topics [Set(grillo)] from broker [ArrayBuffer(BrokerEndPoint(1001,ba53d4fd7595,9092))] failed
at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:73)
at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:94)
at kafka.consumer.ConsumerFetcherManager$LeaderFinderThread.doWork(ConsumerFetcherManager.scala:66)
at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:63)
Caused by: java.nio.channels.ClosedChannelException
at kafka.network.BlockingChannel.send(BlockingChannel.scala:110)
at kafka.producer.SyncProducer.liftedTree1$1(SyncProducer.scala:75)
at kafka.producer.SyncProducer.kafka$producer$SyncProducer$$doSend(SyncProducer.scala:74)
at kafka.producer.SyncProducer.send(SyncProducer.scala:119)
at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:59)
... 3 more
等等
在制作人的控制台里,我写了几句话:
$ docker run --rm --interactive klustera/kafka /opt/kafka_2.11-0.9.0.1/bin/kafka-console-producer.sh --topic grillo --broker-list 171.17.0.4:9092
Hola
¿Cómo estáń?
¿Todo bien?
过了一会儿,我得到了这样的回答:
[2016-03-11 00:39:28,955] ERROR Error when sending message to topic grillo with key: null, value: 4 bytes with error: Failed to update metadata after 60000 ms. (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
[2016-03-11 00:40:28,956] ERROR Error when sending message to topic grillo with key: null, value: 16 bytes with error: Failed to update metadata after 60000 ms. (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
[2016-03-11 00:41:28,956] ERROR Error when sending message to topic grillo with key: null, value: 12 bytes with error: Failed to update metadata after 60000 ms. (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
而在 docker-compose logs
```
...
zookeeper_1 | 2016-03-11 00:39:07,072 [myid:] - INFO [ProcessThread(sid:0 cport:2181)::PrepRequestProcessor@651] - Got user-level KeeperException when processing sessionid:0x153631368b1000b type:create c
xid:0x2 zxid:0x47 txntype:-1 reqpath:n/a Error Path:/consumers Error:KeeperErrorCode = NodeExists for /consumers
zookeeper_1 | 2016-03-11 00:39:07,243 [myid:] - INFO [ProcessThread(sid:0 cport:2181)::PrepRequestProcessor@651] - Got user-level KeeperException when processing sessionid:0x153631368b1000b type:create c
xid:0x19 zxid:0x4b txntype:-1 reqpath:n/a Error Path:/consumers/console-consumer-79688/owners/grillo Error:KeeperErrorCode = NoNode for /consumers/console-consumer-79688/owners/grillo
zookeeper_1 | 2016-03-11 00:39:07,247 [myid:] - INFO [ProcessThread(sid:0 cport:2181)::PrepRequestProcessor@651] - Got user-level KeeperException when processing sessionid:0x153631368b1000b type:create $xid:0x1a zxid:0x4c txntype:-1 reqpath:n/a Error Path:/consumers/console-consumer-79688/owners Error:KeeperErrorCode = NoNode for /consumers/console-consumer-79688/owners
...
更新2
我让它工作,至少,在 `docker-machine` :
首先,我定义了一个名为 `docker-machine` :
DOCKER_VM=kafka_test
然后,我修改 `docker-compose.yml` 具体如下:
KAFKA_ADVERTISED_HOST_NAME: "${DOCKER_MACHINE_IP}"
最后,在 `docker-machine` ,我执行:
DOCKER_MACHINE_IP=$(docker-machine ip $DOCKER_VM) docker-compose up -d
但是在笔记本电脑中(我的意思是,如果不使用虚拟机,它就不能工作)
8条答案
按热度按时间whhtz7ly1#
只需尝试下面的方法&以服务发现为例。
或者你用这个:
gmol16392#
我相信你的价值
KAFKA_ADVERTISED_HOST_NAME
将根据到达容器的方式而改变。如果您试图从另一个容器连接,请使用
kafka
应该是正确的(只要使用“将该名称设置为链接别名”)。如果您试图从主机连接,则该名称将不起作用。您需要使用容器ip地址,您可以使用
docker inspect
. 但是,容器ip地址将发生变化,因此最好在容器内部使用$(hostname -i)
去找回它。iaqfqrcu3#
对于在localhost中开发应用程序,文档中有一个解决方案:“hostname\u command”
希望这能帮助别人。。。
mznpcxlj4#
这是@radek1st answer的一个改进版本。
links
是老 Docker 的方式,networks
是当前方法。在国际海事组织看来,做出任何形式的制度变革都是不好的,也不应该被需要。这也有点违背了使用docker的目的。
然后我使用followbash脚本来开始一些事情。这允许我重写kafka主机名以进行本地开发。
./startup.sh localhost
```!/bin/bash
echo KAFKA_HOSTNAME=${1:-kafka} > .env
docker-compose up -d
ycggw6v25#
我对这个问题的解决方法略有不同。我配置Kafka在
kafka
主机,因为它暴露在localhost:9092
,我在中添加了一个条目/etc/hosts
为了kafka
决心localhost
. 通过这样做,可以从其他docker容器和localhost访问kafka。docker-compose.yml码:
更新的主机文件:
nhjlsmyf6#
我只需更新主机文件并添加:
127.0.0.1 localhost kafkaserver
对我来说很好。我在windows10上使用了相同的docker图像。p1iqtdky7#
我使用以下代码解决此问题:
s71maibg8#
就我个人而言,我有这个问题是因为
KAFKA_ADVERTISED_PORT: "9092"
在Kafka的环境中失踪了。