Мой докер-контейнер kafka не может соединиться с моим докер-контейнером zookeeper - PullRequest
4 голосов
/ 07 июня 2019

Я хочу использовать confluent/kafka и confluent/zookeeper и запускать их на одном сервере Ubuntu.

Я использую следующие конфигурации:

docker run -e ZOOKEEPER_CLIENT_PORT=2181 --name zookeeper confluent/zookeeper

docker run --name kafka -e KAFKA_ADVERTISED_HOST_NAME=kafka -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_CREATE_TOPICS=testtopic:1:1 confluent/kafka

Однако это приводит к: Невозможно подключиться к zookeeper: 2181

У меня есть другие контейнеры, к которым я хочу подключиться, как я могу получить доступ к zookeeper через zookeeper: 2181 и kafka через kafka: 9092?

Ответы [ 3 ]

2 голосов
/ 26 июня 2019

Есть несколько способов сделать это.Но прежде чем мы рассмотрим это, в вашем подходе есть две проблемы, которые необходимо понять.

  • zookeper хост недоступен, когда вы используете docker run, так как каждый из контейнеров работает в разныхсетевая изоляция
  • kafka может запуститься и попытаться подключиться к zookeeper, но zookeeper еще не готов

Решение проблемы с сетью

Вы можетесделать много вещей, чтобы исправить вещи

использовать --net=host для запуска обоих в сети хоста

использовать docker network create <name>, а затем использовать --net=<name> при запуске обоих контейнеров

Или вы можете запустить свой контейнер kafka в сети контейнеров zookeeper.

использовать --net=container:zookeeper при запуске контейнера kafka.Это обеспечит доступ к хосту zookeeper.Это не рекомендуется как таковое до тех пор, пока у вас нет веской причины для этого.Потому что, как только контейнер zookeeper выйдет из строя, будет существовать и сеть вашего kafka контейнера.Но для понимания я поставил эту опцию здесь

Решение проблемы стартовой гонки

Либо вы можете оставить разрыв между стартовыми zookeeper и kafka, чтобы убедиться, чтокогда kafka запускается, zookeeper работает и работает

Другой вариант - использовать флаг --restart=on-failure при запуске докера.Это обеспечит перезапуск контейнера в случае сбоя и попытается повторно подключиться к zookeeper, и, надеюсь, время zookeeper истечет.

Вместо использования docker run я всегда предпочел бы docker-composeчтобы получить такие связанные контейнеры для запуска.Это можно сделать, создав простой файл docker-compose.yml и запустив его с docker-compsoe up

version: "3.4"
services:
  zookeeper:
    image: confluent/zookeeper
    environment:
      - ZOOKEEPER_CLIENT_PORT=2181
  kafka:
    image: confluent/kafka
    environment:
      - KAFKA_ADVERTISED_HOST_NAME=kafka
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
      - KAFKA_CREATE_TOPICS=testtopic:1:1
    depends_on:
      - zookeeper
    restart: on-failure
0 голосов
/ 26 июня 2019

Я работаю на Mac, хотя, это работает нормально.так как сеть 'host' не работает в Mac, я просто создаю сеть с именем kafka_net и помещаю туда контейнеры.

version: "3.4"
services:
  zookeeper:
    image: confluent/zookeeper
    environment:
      - ZOOKEEPER_CLIENT_PORT=2181
    networks:
      - kafka_net
  kafka:
    image: confluent/kafka
    environment:
      - KAFKA_ADVERTISED_HOST_NAME=kafka
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
    depends_on:
      - zookeeper
    networks:
      - kafka_net
    restart: on-failure
networks:
  kafka_net:
    driver: "bridge"

Чтобы убедиться, что все работает:

Войдите в систему.тогда контейнер zookeeper

zookeeper-shell localhost:2181 => You should see something like 'Welcome to ZooKeeper!' after all the big chunk of text

Войдите в контейнер kafka, затем

kafka-topics --zookeeper zookeeper:2181 --list # empty list
kafka-topics --zookeeper zookeeper:2181 --create --topic first_topic --replication-factor 1 --partitions 1
kafka-topics --zookeeper zookeeper:2181 --list # you will see the first_topic
kafka-console-producer --broker-list localhost:9092 --topic first_topic # type some text and ctrl + c
kafka-console-consumer --bootstrap-server localhost:9092 --zookeeper zookeeper:2181 --topic first_topic --from-beginning # you will see the stuff you typed first_topic

Если проблемы все еще возникают, посмотрите официальные примеры.https://github.com/confluentinc/cp-docker-images/tree/5.2.2-post/examples и по-прежнему дает вопросы опубликовать его, подаст руку.

0 голосов
/ 07 июня 2019

Docker запускает контейнеры в изолированной сети, которая называется default bridge, если вы не укажете сеть явно.

Вы можете добиться успеха по-разному, вот два простых:

  1. Поместить контейнеры в одну пользовательскую мостовую сеть

    # create net
    docker network create foo
    docker run --network=foo -e ZOOKEEPER_CLIENT_PORT=2181 --name zookeeper confluent/zookeeper
    docker run --network=foo --name kafka -e KAFKA_ADVERTISED_HOST_NAME=kafka -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_CREATE_TOPICS=testtopic:1:1 confluent/kafka
    
  2. Выставить порты и подключиться через localhost

    docker run -p 2181:2181 -e ZOOKEEPER_CLIENT_PORT=2181 --name zookeeper confluent/zookeeper
    docker run --name kafka -e KAFKA_ADVERTISED_HOST_NAME=kafka -e KAFKA_ZOOKEEPER_CONNECT=host.docker.internal:2181 -e KAFKA_CREATE_TOPICS=testtopic:1:1 confluent/kafka
    

Примечание: при втором подходе вы должны использовать host.docker.internal в качестве имени хоста и выставить (опубликовать) порт 2181 для первого контейнера, чтобы сделать его доступным на localhost

...