【问题标题】:Docker (Compose) client connects to Kafka too earlyDocker(Compose)客户端过早连接到 Kafka
【发布时间】:2017-07-10 12:51:10
【问题描述】:

我正在尝试使用 Docker 和 Docker Compose 运行 Kafka。这是docker-compose.yml

version: "2"

services:
  zookeeper:
    image: "wurstmeister/zookeeper"
    ports:
      - "2181:2181"

  kafka:
    build:
      context: "./services/kafka"
      dockerfile: "Dockerfile"
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: "0.0.0.0"
      KAFKA_CREATE_TOPICS: "test:1:1"
      KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"

  users:
    build:
      context: "./services/users"
      dockerfile: "Dockerfile"
    ports:
      - "4001:4001"
    environment:
      NODE_ENV: "develop"
      ZOOKEEPER_HOST: "zookeeper"
      ZOOKEEPER_PORT: "2181"
    volumes:
      - "./services/users:/service"

用户服务仅尝试连接(使用 Node.js 中的 kafka-node)并监听一个主题并在每次运行时向其发布一条消息。

问题是我不断收到拒绝连接错误。我正在使用 Dockerize 等待 kafka 端口在 Dockerfile 中可用,并带有 CMD dockerize -wait tcp://kafka:9092 node /service/index.js 行。

它在启动用户容器之前等待端口可用并且该系统工作,但它不是在正确的时间。看来Kafka在选举出leader之前就开放了9092端口。

当我先运行 Kafka 并让它完全启动然后运行我的应用程序时,它运行顺利。

如何在开始服务之前等待正确的时间?

【问题讨论】:

    标签: docker apache-kafka docker-compose


    【解决方案1】:

    尝试 docker-compose 2.1 或 3 版,因为它包含一个 healthcheck 指令。
    以“Docker Compose wait for container X before starting Y”为例。

    你可以:

    depends_on:
      kafka:
        condition: service_healthy
    

    然后在 kafka 中添加:

    healthcheck:
        test: ["CMD", ...]
        interval: 30s
        timeout: 10s
        retries: 5
    

    例如使用 curl 命令来测试 kafka 是否已选举出领导者。

    【讨论】:

    • @Industrial 他们确实做到了!不要忘记阅读stackoverflow.com/help/accepted-answer(这个答案,以及你其他问题的答案)
    • 有没有curl命令可以测试kafka是否选举了leader?你甚至可以curl kafka 吗?
    • @c24w 我只知道docs.confluent.io/current/kafka-rest/docs/intro.html(我在检查主题元数据时看到“领导者”:docs.confluent.io/current/kafka-rest/docs/…
    • @VonC 我在谷歌搜索时遇到了 kafka-rest,但希望有一种简单的方法可以通过直接点击它来向 kafka 询问领导者。
    • 根据docker-compose文档:“版本3不再支持depends_on的条件形式”我想使用dockerize,但看不到如何使用动态端口。
    猜你喜欢
    • 2017-04-03
    • 1970-01-01
    • 2016-12-18
    • 2017-08-04
    • 2017-11-22
    • 1970-01-01
    • 2020-06-24
    • 1970-01-01
    • 2022-01-25
    相关资源
    最近更新 更多