2016-03-08 48 views
26

我想用wurstmeister\kafka-docker图片与docker-compose,但我有与连接一切真正的问题。卡夫卡在码头工作不起作用

我检查的所有帖子或问题似乎没有任何问题,但我坦率地失去了。 (并且在SO中至少有两个问题试图解决这个问题)

我认为问题在于我对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" 

UPDATE

继@dnephin的建议之后,我修改了以下行中的start-kafka.sh

... 
if [[ -z "$KAFKA_ADVERTISED_PORT" ]]; then 
    export KAFKA_ADVERTISED_PORT=$(hostname -i) 
fi 
... 

并从docker-compose.yml

KAFKA_ADVERTISED_HOST_NAME: "kafka"我开始在正规途径的容器:

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 

几乎立即直接tely,警告开始飞遍屏幕:

[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)::[email protected]] - 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)::[email protected]] - 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)::[email protected]] - 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 
... 

UPDATE 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 

但在笔记本电脑(我的意思是,不使用的虚拟机,这是行不通的)

+0

只是检查,如果我得到它确定:当你运行一个容器,它的工作原理,但是当你创建另一个(当第一个正在运行)失败?或者问题是你不能连接到卡夫卡容器? –

+0

当我尝试连接使用消费者或生产者失败时...感谢 – nanounanue

+0

这个问题我想你真的想把它设置为KAFKA_ADVERTISED_HOST。这条线将IP地址分配给应该有端口号的变量:'export KAFKA_ADVERTISED_PORT = $(hostname -i)' – Grigory

回答

2

我相信您使用的KAFKA_ADVERTISED_HOST_NAME的值将根据容器的接触方式而改变。

如果您尝试从另一个容器进行连接,则使用kafka应该是正确的(只要您将该名称设置为链接别名)。

如果您尝试从主机连接,则该名称不起作用。您需要使用容器IP地址,您可以使用docker inspect。但是容器的IP地址会发生变化,因此最好从容器内使用$(hostname -i)来设置它以检索它。

+0

感谢您的回答,我必须在哪里放置'$(hostname -i)'?在'docker-compose.yml'中? – nanounanue

+0

在入口点脚本中,或在容器中运行的某个脚本。 – dnephin

2

只需尝试以下步骤&使用服务发现,例如this one

zookeeper: 
    image: wurstmeister/zookeeper 
    ports: 
    - "2181:2181" 
kafka: 
    build: . 
    ports: 
    - "9092:9092" 
    links: 
    - zookeeper:zk 
    environment: 
    KAFKA_ADVERTISED_HOST_NAME: 192.168.59.103 
    KAFKA_ADVERTISED_PORT: 9092 
    KAFKA_CREATE_TOPICS: "test:1:1" 
    volumes: 
    - /var/run/docker.sock:/var/run/docker.sock 

或者你使用这一个:

zookeeper: 
    image: wurstmeister/zookeeper 
    ports: 
    - "2181" 
kafka: 
    build: . 
    ports: 
    - "9092" 
    links: 
    - zookeeper:zk 
    environment: 
    KAFKA_ADVERTISED_HOST_NAME: 192.168.59.103 
    DOCKER_HOST: 192.168.59.103:2375 
    volumes: 
    - /var/run/docker.sock:/var/run/docker.sock 
+0

谢谢,'consul.io'看起来很酷!,但是,你能更具体一些吗,我的意思是,你在哪里得到'192.168.59.103'?你可以在这种情况下指向一个教程设置领事吗? – nanounanue

+0

您是否阅读过文档(https://github.com/wurstmeister/kafka-docker)? 修改docker-compose.yml中的KAFKA_ADVERTISED_HOST_NAME以匹配您的码头主机IP(注意:如果要运行多个代理,请不要使用localhost或127.0.0.1作为主机ip。) – user2550587

+0

正如我在问题中所述如果我使用'docker-machine',但是没有,如果我正在使用我的笔记本电脑作为码头主机(我在GNU/Linux中) – nanounanue

3

对于本地主机开发的应用程序,没有在documentation的解决方案: “HOSTNAME_COMMAND”

kafka: 
    image: wurstmeister/kafka 
    ports: 
    - 9092:9092 
environment: 
    KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 
    HOSTNAME_COMMAND: "route -n | awk '/UG[ \t]/{print $$2}'" 

希望这有助于其他.. 。

10

我对这个问题的解决方法稍有不同。我配置Kafka在kafka主机上做广告,因为它在localhost:9092的主机上暴露,我在/etc/hostskafka中添加了一个条目,以解析为localhost。通过这样做,可以从其他Docker容器和本地主机访问Kafka。

泊坞窗,compose.yml:

my-web-service: 
    build: ./my-web-service 
    ports: 
    - "8000:8000" 
    links: 
    - kafka 
    kafka: 
    image: "wurstmeister/kafka:0.10.2.0" 
    ports: 
    - "9092:9092" 
    hostname: kafka 
    links: 
    - zookeeper 
    environment: 
    - KAFKA_ADVERTISED_HOST_NAME=kafka 
    - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 
    - KAFKA_ADVERTISED_PORT=9092 
    zookeeper: 
    image: wurstmeister/zookeeper 
    ports: 
     - "2181:2181" 

更新hosts文件:

more /etc/hosts 
127.0.0.1  localhost kafka 
+1

谢谢!你保存了我的月的其余部分! – Mohsen

+0

谢谢,127.0.0.1 kafka帮助 – Igorock