2016-03-08 44 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