无法解决卡夫卡:9092':名称或服务未知 - docker / php-rdkafka

时间:2017-03-29 20:07:43

标签: php docker apache-kafka

我想在一个docker容器中将php连接到kafka。

kafka php lib - https://github.com/arnaud-lb/php-rdkafka/

kafka docker container - 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,但我不知道那是好还是坏?

如果有帮助,我的docker-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?

3 个答案:

答案 0 :(得分:8)

经纪人将使用advertised.listeners(在该docker镜像中使用KAFKA_ADVERTISED_HOST_NAME进行抽象)来宣传他们,然后客户端将尝试连接到这些广告主机和端口。

因此,您需要确保客户端可以解析并覆盖此广告主机名,例如通过在客户端主机上的/ etc / hosts中添加“kafka”。

答案 1 :(得分:1)

如果容器的主机IP是192.168.1.110,可以在docker容器环境中设置:

KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://192.168.1.110:{{ kafka_port }}"

答案 2 :(得分:0)

我在操作系统的主机文件中添加了以下内容(在 Windows 上 - C:\Windows\System32\drivers\Etc\hosts 和在 linux 上 - vi /etc/hosts): 卡夫卡 然后可以看到从那台机器到我本地机器的 kafka 消息。