2016-03-08 2 views
26

Я пытаюсь использовать изображение wurstmeister\kafka-docker с docker-compose, но у меня возникают проблемы с подключением всего.Kafka in Docker не работает

Все сообщения или вопросы, которые я проверяю, похоже, не имеют никаких проблем, но я откровенно потерян. (И есть как минимум два вопроса в SO, которые пытаются решить проблему)

Я считаю, что проблема в том, что я плохо разбираюсь в сети docker. Таким образом, проблема:

Я могу потреблять и производить из одного контейнера kafka, но когда я пытаюсь создать другой контейнер (или использовать свой ноутбук с клиентом python), у меня появилось несколько ошибок, связанных с параметром advertised.host.name (в изображение этого параметра KAFKA_ADVERTISED_HOST_NAME)

Я уже пытаюсь установить эту переменную множеством способов, но это просто не работает.

Я ищу авторитетный ответ (т.е. как установить автоматически эти параметры и что это означает), как установить docker-compose.yml

Это мой:

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

kafka: 
    image: wurstmeister/kafka 
# hostname: kafka 
    ports: 
    - "9092" 
    links: 
    - zookeeper:zk 
    environment: 
    KAFKA_ADVERTISED_HOST_NAME: "kafka" 
    KAFKA_ADVERTISED_PORT: "9092" 
    KAFKA_ZOOKEEPER_CONNECT: "zk:2181" 

UPDATE

Следуя рекомендациям @dnephin, я модифицировал start-kafka.sh в следующих строках:

... 
if [[ -z "$KAFKA_ADVERTISED_PORT" ]]; then 
    export KAFKA_ADVERTISED_PORT=$(hostname -i) 
fi 
... 

и удалить KAFKA_ADVERTISED_HOST_NAME: "kafka" из docker-compose.yml

Я начал контейнеры в каноническим образом:

docker-compose up -d 

Оба контейнера бегут:

$ docker-compose ps 
      Name       Command    State      Ports      
----------------------------------------------------------------------------------------------------------------- 
infraestructura_kafka_1  start-kafka.sh     Up  0.0.0.0:32768->9092/tcp      
infraestructura_zookeeper_1 /opt/zookeeper/bin/zkServe ... Up  0.0.0.0:2181->2181/tcp, 2888/tcp, 3888/tcp 

После этого я сделал:

docker-compose logs 

И все работает плавно.

Для проверки IP-адреса:

$ KAFKA_IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' infraestructura_kafka_1)                            
$ echo $KAFKA_IP 
172.17.0.4 

and 

$ ZK_IP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' infraestructura_zookeeper_1)                           
$ echo $ZK_IP 
172.17.0.3 

Тогда я исполняю в двух Дифференц консолях:

Производитель:

$ docker run --rm --interactive wurstmeister/kafka /opt/kafka_2.11-0.9.0.1/bin/kafka-console-producer.sh --topic grillo --broker-list 171.17.0.4:9092 

Потребитель:

$ docker run --rm --interactive wurstmeister/kafka /opt/kafka_2.11-0.9.0.1/bin/kafka-console-consumer.sh --topic grillo --from-beginning --zookeeper 172.17.0.3:2181 

Почти Immedia ДЕТАЛЬ, предупреждения начинают летать по всему экрану:

[2016-03-11 00:39:17,010] WARN Fetching topic metadata with correlation id 0 for topics [Set(grillo)] from broker [BrokerEndPoint(1001,ba53d4fd7595,9092)] failed (kafka.client.ClientUtils$) 
java.nio.channels.ClosedChannelException 
     at kafka.network.BlockingChannel.send(BlockingChannel.scala:110) 
     at kafka.producer.SyncProducer.liftedTree1$1(SyncProducer.scala:75) 
     at kafka.producer.SyncProducer.kafka$producer$SyncProducer$$doSend(SyncProducer.scala:74) 
     at kafka.producer.SyncProducer.send(SyncProducer.scala:119) 
     at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:59) 
     at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:94) 
     at kafka.consumer.ConsumerFetcherManager$LeaderFinderThread.doWork(ConsumerFetcherManager.scala:66) 
     at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:63) 
[2016-03-11 00:39:17,013] WARN [console-consumer-79688_9dd5f575d557-1457656747003-f1ed369d-leader-finder-thread], Failed to find leader for Set([grillo,0]) (kafka.consumer.ConsumerFetcherManager$LeaderFin 
derThread) 
kafka.common.KafkaException: fetching topic metadata for topics [Set(grillo)] from broker [ArrayBuffer(BrokerEndPoint(1001,ba53d4fd7595,9092))] failed 
     at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:73) 
     at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:94) 
     at kafka.consumer.ConsumerFetcherManager$LeaderFinderThread.doWork(ConsumerFetcherManager.scala:66) 
     at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:63) 
Caused by: java.nio.channels.ClosedChannelException 
     at kafka.network.BlockingChannel.send(BlockingChannel.scala:110) 
     at kafka.producer.SyncProducer.liftedTree1$1(SyncProducer.scala:75) 
     at kafka.producer.SyncProducer.kafka$producer$SyncProducer$$doSend(SyncProducer.scala:74) 
     at kafka.producer.SyncProducer.send(SyncProducer.scala:119) 
     at kafka.client.ClientUtils$.fetchTopicMetadata(ClientUtils.scala:59) 
     ... 3 more 

и так далее

В консоли производителя, я написал несколько предложений:

$ docker run --rm --interactive klustera/kafka /opt/kafka_2.11-0.9.0.1/bin/kafka-console-producer.sh --topic grillo --broker-list 171.17.0.4:9092               
Hola 
¿Cómo estáń? 
¿Todo bien? 

И несколько минут спустя, я получил такой ответ:

[2016-03-11 00:39:28,955] ERROR Error when sending message to topic grillo with key: null, value: 4 bytes with error: Failed to update metadata after 60000 ms. (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback) 
[2016-03-11 00:40:28,956] ERROR Error when sending message to topic grillo with key: null, value: 16 bytes with error: Failed to update metadata after 60000 ms. (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback) 
[2016-03-11 00:41:28,956] ERROR Error when sending message to topic grillo with key: null, value: 12 bytes with error: Failed to update metadata after 60000 ms. (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback) 

И в docker-compose logs

... 
zookeeper_1 | 2016-03-11 00:39:07,072 [myid:] - INFO [ProcessThread(sid:0 cport:2181)::[email protected]] - Got user-level KeeperException when processing sessionid:0x153631368b1000b type:create c 
xid:0x2 zxid:0x47 txntype:-1 reqpath:n/a Error Path:/consumers Error:KeeperErrorCode = NodeExists for /consumers 
zookeeper_1 | 2016-03-11 00:39:07,243 [myid:] - INFO [ProcessThread(sid:0 cport:2181)::[email protected]] - Got user-level KeeperException when processing sessionid:0x153631368b1000b type:create c 
xid:0x19 zxid:0x4b txntype:-1 reqpath:n/a Error Path:/consumers/console-consumer-79688/owners/grillo Error:KeeperErrorCode = NoNode for /consumers/console-consumer-79688/owners/grillo 
zookeeper_1 | 2016-03-11 00:39:07,247 [myid:] - INFO [ProcessThread(sid:0 cport:2181)::[email protected]] - Got user-level KeeperException when processing sessionid:0x153631368b1000b type:create $xid:0x1a zxid:0x4c txntype:-1 reqpath:n/a Error Path:/consumers/console-consumer-79688/owners Error:KeeperErrorCode = NoNode for /consumers/console-consumer-79688/owners 
... 

ОБНОВЛЕНИЕ 2

Я сделал это работает, по крайней мере, в docker-machine:

Во-первых, я определил переменную с именем docker-machine:

DOCKER_VM=kafka_test 

Тогда , Я изменяю docker-compose.yml следующим образом:

KAFKA_ADVERTISED_HOST_NAME: "${DOCKER_MACHINE_IP}" 

Наконец, в среде docker-machine, я выполняю:

DOCKER_MACHINE_IP=$(docker-machine ip $DOCKER_VM) docker-compose up -d 

Но в ноутбуке (я имею в виду, не используя виртуальную машину, она не работает)

+0

Просто проверяю, если я получил это нормально: это работает, когда вы запускаете один контейнер, но при создании другой (когда первый работает), это не удается? Или проблема в том, что вы не можете подключиться к контейнеру kafka? –

+0

Когда я пытаюсь подключиться с использованием потребителя или продюсера, не получается ... спасибо за вопрос – nanounanue

+0

Я полагаю, вы действительно хотели установить его вместо KAFKA_ADVERTISED_HOST. эта строка назначит IP-адрес переменной, которая должна иметь номер порта: 'export KAFKA_ADVERTISED_PORT = $ (hostname -i)' – Grigory

ответ

2

Я считаю, значение, которое вы используете для KAFKA_ADVERTISED_HOST_NAME, изменится в зависимости от того, как можно достичь контейнера.

Если вы пытаетесь подключиться из другого контейнера, используйте kafka, если вы используете это имя как псевдоним ссылки.

Если вы пытаетесь соединиться с хостом, это имя не будет работать. Вам нужно будет использовать IP-адрес контейнера, который вы можете использовать с помощью docker inspect. Однако IP-адрес контейнера изменится, поэтому было бы лучше установить это изнутри контейнера, используя $(hostname -i) для его получения.

+0

Спасибо, что ответили: Где мне нужно положить '$ (hostname -i)'? В 'docker-compose.yml'? – nanounanue

+0

В сценарии точки входа или в каком-либо скрипте, который выполняется в контейнере. – dnephin

2

Просто попробуйте следующее & использовать обнаружение службы, например this one.

zookeeper: 
    image: wurstmeister/zookeeper 
    ports: 
    - "2181:2181" 
kafka: 
    build: . 
    ports: 
    - "9092:9092" 
    links: 
    - zookeeper:zk 
    environment: 
    KAFKA_ADVERTISED_HOST_NAME: 192.168.59.103 
    KAFKA_ADVERTISED_PORT: 9092 
    KAFKA_CREATE_TOPICS: "test:1:1" 
    volumes: 
    - /var/run/docker.sock:/var/run/docker.sock 

Или вы используете этот один:

zookeeper: 
    image: wurstmeister/zookeeper 
    ports: 
    - "2181" 
kafka: 
    build: . 
    ports: 
    - "9092" 
    links: 
    - zookeeper:zk 
    environment: 
    KAFKA_ADVERTISED_HOST_NAME: 192.168.59.103 
    DOCKER_HOST: 192.168.59.103:2375 
    volumes: 
    - /var/run/docker.sock:/var/run/docker.sock 
+0

Спасибо, 'consul.io' кажется очень классным !, но, не могли бы вы уточнить, я имею в виду, где вы получаете' 192.168.59.103'? Не могли бы вы указать на консул настройки учебника в этом сценарии? – nanounanue

+0

Вы читали документ (https://github.com/wurstmeister/kafka-docker)? Изменить KAFKA_ADVERTISED_HOST_NAME в файле docker-compose.yml в соответствии с IP-адресом вашего док-станции (Примечание: не используйте localhost или 127.0.0.1 в качестве хоста ip, если вы хотите запускать несколько брокеров.) – user2550587

+0

Как я уже сказал в этом вопросе работает, если я использую 'docker-machine', но нет, если я использую свой ноутбук как хост-докер (я нахожусь в GNU/Linux) – nanounanue

3

Для разработки приложений в локальном хосте, есть решение в documentation: "HOSTNAME_COMMAND"

kafka: 
    image: wurstmeister/kafka 
    ports: 
    - 9092:9092 
environment: 
    KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 
    HOSTNAME_COMMAND: "route -n | awk '/UG[ \t]/{print $$2}'" 

Надежда эта помощь другим .. .

10

Мое решение этой проблемы несколько отличается. Я настраиваю Kafka на рекламу на хосте kafka, и потому, что он выставлен на главной машине на localhost:9092, я добавляю запись в /etc/hosts для kafka, чтобы разрешить localhost. Благодаря этому Kafka можно получить доступ как из других контейнеров докеров, так и из localhost.

докер-compose.yml:

my-web-service: 
    build: ./my-web-service 
    ports: 
    - "8000:8000" 
    links: 
    - kafka 
    kafka: 
    image: "wurstmeister/kafka:0.10.2.0" 
    ports: 
    - "9092:9092" 
    hostname: kafka 
    links: 
    - zookeeper 
    environment: 
    - KAFKA_ADVERTISED_HOST_NAME=kafka 
    - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 
    - KAFKA_ADVERTISED_PORT=9092 
    zookeeper: 
    image: wurstmeister/zookeeper 
    ports: 
     - "2181:2181" 

Обновлено хостов файл:

more /etc/hosts 
127.0.0.1  localhost kafka 
+1

Спасибо! Вы спасли остаток моего месяца! – Mohsen

+0

спасибо, 127.0.0.1 kafka помог – Igorock

Смежные вопросы