我是码头工人的新手。
我必须创建一个kafka容器 将有一个消费者容器,其工作是消费并保存到mongodb。
我的docker-compose看起来像这样:
version: '2'
services:
consumer:
image: springio/kafka-consumer
depends_on:
- kafka
- mongodb
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_CREATE_TOPICS: "test:1:1"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock:/var/run/docker.sock
mongodb:
image: mongo
container_name: "mongodb"
environment:
- MONGO_DATA_DIR=/data/db
- MONGO_LOG_DIR=/dev/null
volumes:
- ./data/db:/data/db
ports:
- 27017:27017
据我了解,我无法使用KAFKA_ADVERTISED_HOST_NAME作为' localhost'因为那时消费者容器将无法访问它(因为它会尝试连接到它自己的容器localhost)。 因此我将它命名为“kafka'。
现在,我想在我的主机上运行一个生产者(而不是一个容器)(容器运行的同一台机器)。
问题是,当我将KAFKA_ADVERTISED_HOST_NAME更改为与localhost不同时,我无法从主机生产者生成kafka。
为什么我不能向卡夫卡出示?我想当我说端口:9092:9092时,我实际上是将该端口导出到主机,我错了吗?
在没有为制作人使用额外容器的情况下,从主机到达kafka的最佳方法是什么?
任何帮助都将不胜感激!!
修改
当我尝试使用kafka-console-producer生成消息时,只有当KAFKA_ADVERTISED_HOST_NAME不是' localhost'时,才会收到以下消息:
错误使用密钥向主题测试发送消息时出错:null,value: 3个字节有错误: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback) org.apache.kafka.common.errors.TimeoutException:过期1条记录 对于test-0:自批量创建加上延迟时间
以来已经过了1503 ms
答案 0 :(得分:0)
我遇到了同样的问题,如果您没有指定主机名kafka
,kafka就不会知道主机名hostname: kafka
因此您被迫使用localhost或来自docker引擎的ip。
您可以在docker-compose.yml
中添加 kafka:
image: wurstmeister/kafka
ports:
- "9092:9092"
hostname: kafka
environment:
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_CREATE_TOPICS: "test:1:1"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock:/var/run/docker.sock
条目来解决此问题,即:
10.0.75.1
Here有一个以这种方式配置的示例项目。然后,如果需要,您也可以在计算机主机文件中添加相同的名称,并将其映射到docker machine ip(windows default melt
)。但是,您的docker-compos中的服务不需要这个额外的步骤来正确地找到kafka。
答案 1 :(得分:0)
它可能无法直接回答您的问题,但这是我的docker-compose文件
false
这就是我从容器外部(在我的情况下也位于VM外部)消费它的方式
// Set this property to true to allow NavigationItems to display large titles
let navigationController = UINavigationController()
navigationController.navigationBar.prefersLargeTitles = true
/*
Choose between `always`, `never` and `automatic` to decide
if this particular view controller should display a large title.
*/
let viewController = UIViewController()
viewController.navigationItem.largeTitleDisplayMode = .always