从localhost

时间:2018-05-03 10:28:58

标签: docker apache-kafka docker-compose

我是码头工人的新手。

我必须创建一个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。

  1. 为什么我不能向卡夫卡出示?我想当我说端口:9092:9092时,我实际上是将该端口导出到主机,我错了吗?

  2. 在没有为制作人使用额外容器的情况下,从主机到达kafka的最佳方法是什么?

  3. 任何帮助都将不胜感激!!

    修改

    当我尝试使用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

2 个答案:

答案 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