ドッカーのコンテナ内で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から接続できますか?
ありがとうございます! httpdのコンテナが 'kafka'または私の外側のホストマシンを解決できる必要があることを意味しますか? Dockerは通常、ホスト名としてドッカーの内部ですべてのサービス名を解決します。これは、たとえばmysqlコンテナサービス名を使用してphpからmysqlコンテナに接続する場合に機能します。私は遊びをして見ます。 – Horse
kafkaクライアントは、ブローカ(クライアントで設定されている)とブローカのアドバタイズされたホスト名の両方のブローカを解決して到達する必要があります。あなたのPHPクライアントがhttpdから起動された場合、httpdのコンテナ/ホストは解決して到達できる必要があります。 – Edenhill
アドバイスありがとうございます。最後に別のドッカーコンテナ(誰でも興味があればflozano/kafka)を使い、ymlファイルでホストIPを使用しましたが、ymlサービス名、たとえばPHPの 'kafka'をブローカのホスト名として使用しました。 – Horse