2017-03-29 7 views
2

ドッカーのコンテナ内でkafkaに接続するためのPHPを取得しようとしています。'kafka:9092'の解決に失敗しました:名前またはサービスが不明 - ドッカー/ php-rdkafka

カフカのphpのlibからhttps://github.com/arnaud-lb/php-rdkafka/

カフカドッキングウィンドウコンテナからhttps://hub.docker.com/r/wurstmeister/kafka/

すべてが構築して、[OK]を実行しているが、私は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

私の質問:どのように私はkafkaに正常にPHPから接続できますか?

答えて

2

ブローカーはadvertised.listeners(そのドッカーイメージでKAFKA_ADVERTISED_HOST_NAMEで抽象化されているようです)を使用してthemselveを宣伝します。その結果、クライアントは広告されたホストとポートに接続しようとします。

したがって、このアドバタイズされたホスト名をクライアントが解決して到達できるようにする必要があります。クライアントホストの/ etc/hostsに "kafka"を追加します。

+0

ありがとうございます! httpdのコンテナが 'kafka'または私の外側のホストマシンを解決できる必要があることを意味しますか? Dockerは通常、ホスト名としてドッカーの内部ですべてのサービス名を解決します。これは、たとえばmysqlコンテナサービス名を使用してphpからmysqlコンテナに接続する場合に機能します。私は遊びをして見ます。 – Horse

+1

kafkaクライアントは、ブローカ(クライアントで設定されている)とブローカのアドバタイズされたホスト名の両方のブローカを解決して到達する必要があります。あなたのPHPクライアントがhttpdから起動された場合、httpdのコンテナ/ホストは解決して到達できる必要があります。 – Edenhill

+0

アドバイスありがとうございます。最後に別のドッカーコンテナ(誰でも興味があればflozano/kafka)を使い、ymlファイルでホストIPを使用しましたが、ymlサービス名、たとえばPHPの 'kafka'をブローカのホスト名として使用しました。 – Horse

関連する問題