wurstmeister\kafka-docker
でdocker-compose
の画像を使用しようとしていますが、すべてを接続するのに本当の問題があります。
私がチェックするすべての投稿や質問には問題はないようですが、率直に言って迷っています。 (そして、SOには問題に対処しようとする少なくとも2つの質問があります)
問題は、docker
のネットワークに対する私の不十分な理解だと思います。だから問題:
私はカフカの同じコンテナから消費して生産できますが、別のコンテナを作成しようとすると(またはラップトップで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
次に、2つの異なるコンソールで実行します。
プロデューサー:
$ 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
ほとんどすぐに、画面全体に警告が表示され始めます。
[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)::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
...
更新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
しかし、ラップトップでは(つまり、仮想マシンを使用しないと機能しません)
この問題に対する私の解決策は少し異なります。 Kafkaをkafka
ホストにアドバタイズするように構成し、localhost:9092
のホストマシンで公開されているため、/etc/hosts
にkafka
のエントリを追加しますlocalhost
に解決します。これにより、他のDockerコンテナとローカルホストの両方からKafkaにアクセスできます。
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"
更新されたホストファイル:
more /etc/hosts
127.0.0.1 localhost kafka
ローカルホストでアプリを開発する場合、 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}'"
これが他の人を助けることを願っています...
KAFKA_ADVERTISED_Host_NAME
に使用する値は、コンテナへの到達方法に応じて変わると思います。
別のコンテナから接続しようとしている場合は、kafka
を使用するのが正しいはずです(その名前をリンクエイリアスとして設定する限り)。
ホストから接続しようとしている場合、その名前は機能しません。 docker inspect
を使用して取得できるコンテナIPアドレスを使用する必要があります。ただし、コンテナのIPアドレスは変更されるため、$(hostname -i)
を使用してコンテナの内部から取得して取得することをお勧めします。
以下を試して、たとえば 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
これが@ radek1st回答の改良版です。
links
は古いdocker way、networks
は現在のメソッドです。
imo、あらゆる種類のシステム変更を行うことは良くないため、決して必要ではありません。また、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
次に、フォローbashスクリプトを使用して開始します。これにより、ローカル開発用にKafkaホスト名をオーバーライドできます。 ./startup.sh localhost
#!/bin/bash
echo KAFKA_HOSTNAME=${1:-kafka} > .env
docker-compose up -d
続きを読む -
私はこの問題をコードの下で使用して解決します:
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
個人的には、kafka環境にKAFKA_ADVERTISED_PORT: "9092"
がないために問題がありました。
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