2017-03-29 61 views
2

我試圖讓PHP連接到一個docker容器內的kafka。未能解決'kafka:9092':名稱或服務未知 - docker/php-rdkafka

卡夫卡PHP LIB - https://github.com/arnaud-lb/php-rdkafka/

卡夫卡搬運工容器 - https://hub.docker.com/r/wurstmeister/kafka/

一切都在構建和運行正常,但是當我嘗試用PHP製作連接,我得到如下:

httpd_1 | %3|1490816385.542|FAIL|rdkafka#producer-1| [thrd:kafka:9092/bootstrap]: kafka:9092/bootstrap: Failed to resolve 'kafka:9092': Name or service not known 
httpd_1 | %3|1490816385.543|ERROR|rdkafka#producer-1| [thrd:kafka:9092/bootstrap]: kafka:9092/bootstrap: Failed to resolve 'kafka:9092': Name or service not known 
httpd_1 | %3|1490816385.543|ERROR|rdkafka#producer-1| [thrd:kafka:9092/bootstrap]: 1/1 brokers are down 

我在PHP中使用以下代碼

$rk = new RdKafka\Producer(); 
    $rk->setLogLevel(LOG_DEBUG); 
    $rk->addBrokers("kafka"); 

    $topicConf = new RdKafka\TopicConf(); 
    $topicConf->set("message.timeout.ms", 1000); 
    $topic = $rk->newTopic("DEV", $topicConf); 

    $topic->produce(RD_KAFKA_PARTITION_UA, 0, "Message"); 

    $rk->poll(1000); 
    $kafkaConf = new RdKafka\Conf(); 
    $kafkaConf->setErrorCb(function ($rk, $err, $reason) { 
     printf("Kafka error: %s (reason: %s)\n", rd_kafka_err2str($err), $reason); 
    }); 
    $kafkaConf->setDrMsgCb(function ($rk, $message) { 
     if ($message->err) { 
      print_r($message); 
     } else { 
      print_r("ok"); 
     } 
    }); 

我玩過,試圖在docker-compose.yml和PHP代碼中設置主機IP,但沒有喜悅。我也有connection refused,但我不知道這是好還是壞?

如果有幫助,我的搬運工,compose.yml

httpd: 
    build: . 
    ports: 
    - 8180:80 
    volumes: 
    - ~/www:/var/www/html 
zookeeper: 
    image: wurstmeister/zookeeper 
    ports: 
    - "2181:2181" 
kafka: 
    build: ~/kafka-docker/. 
    links: 
    - zookeeper 
    ports: 
    - "9092:9092" 
    environment: 
    KAFKA_ADVERTISED_HOST_NAME: kafka 
    KAFKA_ADVERTISED_PORT: 9092 
    KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 
    volumes: 
    - /var/run/docker.sock:/var/run/docker.sock 
  • PHP版本:7.0.17

  • librdkafka版本:0.9.5.0

  • PHP-rdkafka版本:2.0.1

我的問題:任何想法如何我可以成功地從PHP連接到kafka?

回答

2

代理將使用advertised.listeners(它似乎在該docker映像中用KAFKA_ADVERTISED_HOST_NAME抽象出來)爲它們做廣告,客戶端將嘗試連接到這些通告的主機和端口。

因此,您需要確保客戶端可以解析並訪問此廣告主機名,例如通過在客戶端主機上的/ etc/hosts中添加「kafka」。

+0

感謝您的迴應!你的意思是說httpd容器需要能夠解析'kafka',或者我的外部主機? Docker通常會在Docker內部將所有服務名稱解析爲主機名。例如,當使用mysql容器服務名稱連接到來自php的mysql容器時,這是有效的。我會玩一玩,看看。 – Horse

+1

卡夫卡客戶端需要能夠解析和聯繫代理商,既包括引導代理(在客戶端配置),也包括代理公佈的主機名。如果您的PHP客戶端是從httpd觸發的,那麼httpd容器/主機需要能夠解析並達到 – Edenhill

+0

感謝您的建議。最後,我最終使用了另一個docker容器(如果有人感興趣,可以使用flozano/kafka),然後在yml文件中使用主機IP,但使用yml服務名稱,例如PHP中的'kafka'作爲代理主機名。 – Horse

相關問題