无法解析“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:名称或服务未知