无法解析“kafka:9092”:名称或服务未知 - docker / php-rdkafka

Posted

技术标签:

【中文标题】无法解析“kafka:9092”:名称或服务未知 - docker / php-rdkafka【英文标题】:Failed to resolve 'kafka:9092': Name or service not known - docker / php-rdkafka 【发布时间】:2017-08-23 12:16:00 【问题描述】:

我正在尝试让 php 在 docker 容器中连接到 kafka。

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

kafka docker 容器 - 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 吗?

【问题讨论】:

【参考方案1】:

代理将使用adverted.listeners(似乎在该docker镜像中用KAFKA_ADVERTISED_HOST_NAME抽象出来)为自己做广告,因此客户端将尝试连接到这些广告主机和端口。

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

【讨论】:

感谢您的回复!你的意思是httpd容器需要能够解析kafka,还是我的外部主机? Docker 通常在内部将 docker-compose 中的所有服务名称解析为主机名。例如,当使用 mysql 容器服务名称从 php 连接到 mysql 容器时,此方法有效。我会玩一会看看。 kafka 客户端需要能够解析并访问代理,包括引导代理(在客户端中配置)以及代理的广告主机名。如果您的 PHP 客户端是从 httpd 触发的,那么 httpd 容器/主机需要能够解析并到达 感谢您的建议。最后我最终使用了另一个 docker 容器(如果有人感兴趣,可以使用 flozano/kafka),然后在 yml 文件中使用主机 IP,但使用 yml 服务名称,例如 PHP 中的 kafka 作为代理主机名。 @Horse 使用 flozano/kafka 对你有用吗?还是您遵循了 Edenhill 建议的方法? @Edenhill 我在 docker-compose iirc 中使用了主机名。虽然最后没有长期使用kafka。【参考方案2】:

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

KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://192.168.1.110: kafka_port "

【讨论】:

这应该是公认的答案,因为需要手动将条目添加到 hosts/resolve.conf 文件不是可移植的解决方案。【参考方案3】:

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

【讨论】:

以上是关于无法解析“kafka:9092”:名称或服务未知 - docker / php-rdkafka的主要内容,如果未能解决你的问题,请参考以下文章

apache 虚拟主机(EAI 2)名称或服务未知:AH00547:无法解析主机名

ssh:无法解析主机名 git:名称或服务未知 致命:无法从远程存储库读取

ssh:无法解析主机名 gitlab.com:user_name/repo_name.git:名称或服务未知

无法推送到 Heroku '致命:无法访问..无法解析主机:(无);提供节点名或服务名,或未知'

无法解析主机名 git:提供节点名或服务名,或未知

ubuntu18.04 ping域名提示“未知的名称或服务”