Kafka – Docker – 从主机发送邮件到容器时出错(批量过期)

我在排除故障时遇到困难,应该是一个简单的问题。

我试图从kafak-console-producer发布一些消息。 当我input'嗨'我得到:

 /opt/kafka/bin/kafka-console-producer.sh --topic test --broker-list 172.17.0.21:9092 hi [2016-01-25 12:56:19,839] ERROR Error when sending message to topic test with key: null, value: 2 bytes with error: Batch Expired (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback) 

我似乎无法find任何kafka-log4j日志…

我正在快速启动中描述的方式运行kafka服务器

我可以创build主题并描述它。

可能很重要的一个注意事项是,kafka&zookeeper正在docker-container( 172.17.0.21 )中运行。我正在创build主题并从主机发送消息。


请注意这两个(kafka服务器)9092&(zk)2181是打开和主机访问,我已经证实了这一点,使用netstat&telnet。

原来是更多的Docker问题…

好的,当运行客户端kafka-console-consumer.sh我看到它试图使用容器名称(这是GUID的前几个字符)连接到代理。

我的主机无法使用主机名parsing连接到docker-container。

由于我已经将端口映射到我的主机,我改变了kafak-serverconfiguration的advertised.host.name指向我的主机的IP地址。

这样,每当zk查询经纪人我的主机的IP地址返回,然后通过端口转发我连接到docker的经纪人。

我正在尝试在docker中使用kafka 0.10.0.0,并在下面find

advertised.host.name DEPRECATED:仅在advertised.listenerslisteners未设置时使用。 改用advertised.listeners 。 主机名发布到ZooKeeper供客户使用。 在IaaS环境中,这可能需要与代理绑定的接口不同。 如果未设置,则将使用host.name的值(如果已configuration)。 否则,它将使用从java.net.InetAddress.getCanonicalHostName()返回的值。

所以设置advertised.listeners = PLAINTEXT:// yourhost:9092将工作

顺便说一句,你知道你可以从docker run命令设置该variables,对不对?

例如,这就是我开始在一个容器中开始Kafka&ZK,为我的本地开发环境:

 docker run --name st-kafka -p 2181:2181 -p 9092:9092 -e ADVERTISED_HOST=`docker-machine ip machine_name` -e ADVERTISED_PORT=9092 -d spotify/kafka 

然后,创build一个话题:

 docker exec -ti st-kafka bash -c "/opt/kafka_*/bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 4 --topic topic_name" 

这是在OS X,这就是为什么我使用docker-machine ip MACHINE_NAME
正如你所看到的,这就是Spotify的形象。 虽然我上次检查时没有v0.9 ,但分叉Dockerfile并调整为0.9是微不足道的。

Interesting Posts