J'essaie d'utiliser l'image wurstmeister\kafka-docker
Avec docker-compose
, Mais j'ai de réels problèmes pour tout connecter.
Tous les messages ou questions que je vérifie ne semblent pas poser de problèmes, mais je suis franchement perdu. (Et il y a au moins deux questions dans SO qui tentent de résoudre le problème)
Je crois que le problème est ma mauvaise compréhension de la mise en réseau de docker
. Donc le problème:
Je peux consommer et produire à partir du même conteneur de kafka, mais lorsque j'essaie de créer un autre conteneur (ou d'utiliser mon ordinateur portable avec un client python client), plusieurs erreurs liées au advertised.Host.name
Paramètre (dans l'image, ce paramètre est KAFKA_ADVERTISED_Host_NAME
)
J'essaie déjà de définir cette variable de nombreuses manières, mais cela ne fonctionne tout simplement pas.
Je cherche donc une réponse (c.-à-d. Comment définir automatiquement ces paramètres et quelle est sa signification) (comment définir le docker-compose.yml
C'est à moi:
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"
MISE À JOUR
Suivant les conseils de @dnephin, j'ai modifié le start-kafka.sh
Dans les lignes suivantes:
...
if [[ -z "$KAFKA_ADVERTISED_PORT" ]]; then
export KAFKA_ADVERTISED_PORT=$(hostname -i)
fi
...
et retirez KAFKA_ADVERTISED_Host_NAME: "kafka"
du docker-compose.yml
J'ai commencé les conteneurs de manière canonique:
docker-compose up -d
Les deux conteneurs fonctionnent:
$ 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
Après j'ai fait:
docker-compose logs
Et tout se passe bien.
Pour vérifier les adresses 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
Ensuite, j'exécute dans deux consoles différentes:
Un producteur:
$ 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
Un consommateur:
$ 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
Presque immédiatement, les avertissements commencent à voler sur tout l'écran:
[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
etc
Dans la console du producteur, j'ai écrit quelques phrases:
$ 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?
Et quelques instants plus tard, j'ai eu cette réponse:
[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)
Et dans le docker-compose logs
...
zookeeper_1 | 2016-03-11 00:39:07,072 [myid:] - INFO [ProcessThread(sid:0 cport:2181)::PrepRequestProcessor@651] - 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)::PrepRequestProcessor@651] - 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)::PrepRequestProcessor@651] - 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
...
PDATE 2
Je l'ai fait fonctionner, au moins, dans docker-machine
:
Premièrement, j'ai défini une variable avec le nom du docker-machine
:
DOCKER_VM=kafka_test
Ensuite, je modifie le docker-compose.yml
Comme suit:
KAFKA_ADVERTISED_Host_NAME: "${DOCKER_MACHINE_IP}"
Enfin, dans l'environnement du docker-machine
, J'exécute:
DOCKER_MACHINE_IP=$(docker-machine ip $DOCKER_VM) docker-compose up -d
Mais dans l'ordinateur portable (je veux dire, sans utiliser de machine virtuelle, ça ne marche pas)
Ma solution à ce problème est légèrement différente. Je configure Kafka pour annoncer sur kafka
hôte et, car il est exposé sur l'ordinateur hôte sur localhost:9092
, J'ajoute une entrée dans /etc/hosts
pour kafka
à résoudre en localhost
. En faisant cela Kafka est accessible depuis les autres conteneurs Docker et depuis localhost.
docker-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"
Fichier d'hôtes mis à jour:
more /etc/hosts
127.0.0.1 localhost kafka
Pour développer une application dans localhost, il existe une solution dans le 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}'"
J'espère que cela aidera les autres ...
Je crois que la valeur que vous utilisez pour KAFKA_ADVERTISED_Host_NAME
Changera en fonction de la façon dont le conteneur peut être atteint.
Si vous essayez de vous connecter depuis un autre conteneur, utilisez kafka
devrait être correct (tant que vous définissez ce nom comme alias de lien).
Si vous essayez de vous connecter à partir de l'hôte, ce nom ne fonctionnera pas. Vous devez utiliser l'adresse IP du conteneur, que vous pouvez obtenir en utilisant docker inspect
. Cependant, l'adresse IP du conteneur va changer. Il est donc préférable de le définir depuis l'intérieur du conteneur en utilisant $(hostname -i)
pour le récupérer.
Essayez juste ce qui suit et utilisez la découverte de service par exemple celle-ci .
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
Ou vous utilisez celui-ci:
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
voici une version améliorée de la réponse @ radek1st.
links
est l'ancienne méthode du menu fixe, networks
est la méthode actuelle.
imo, faire tout type de changement de système n'est pas bon et ne devrait jamais être nécessaire. cela va aussi à l'encontre de l'objectif d'utiliser Docker.
version: '2.1'
networks:
sb:
driver: bridge
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
container_name: zookeeper
hostname: zookeeper
networks:
- sb
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
kafka:
image: confluentinc/cp-kafka:latest
container_name: kafka
hostname: ${KAFKA_HOSTNAME:-kafka}
depends_on:
- zookeeper
networks:
- sb
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_Host_NAME: ${KAFKA_HOSTNAME:-kafka}
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://${KAFKA_HOSTNAME:-kafka}:9092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
Ensuite, j'utilise le script follow bash pour commencer. Cela me permet de remplacer le Kafka nom d’hôte pour le développement local. ./startup.sh localhost
#!/bin/bash
echo KAFKA_HOSTNAME=${1:-kafka} > .env
docker-compose up -d
Lire la suite -
Je résous ce problème, utilisez le code ci-dessous:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
ports:
- "9092:9092"
depends_on:
- zookeeper
environment:
HOSTNAME_COMMAND: "ifconfig eth0 | grep 'inet addr' | awk '{ print $$2}' | awk -F: '{print $$2}''"
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock:/var/run/docker.sock
Personnellement, j'avais le problème parce que le KAFKA_ADVERTISED_PORT: "9092"
était manquant dans l'environnement kafka.
kafka:
image : wurstmeister/kafka
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_Host_NAME: 127.0.0.1
KAFKA_ADVERTISED_PORT: "9092"
KAFKA_CREATE_TOPICS: "test:1:1"
KAFKA_ZOOKEEPER_CONNECT: zookeeper