ホームページ  >  記事  >  バックエンド開発  >  Docker で実行されている Kafka に接続します

Docker で実行されている Kafka に接続します

PHPz
PHPz転載
2024-02-14 23:42:08948ブラウズ

连接到在 Docker 中运行的 Kafka

今日のソフトウェア開発分野では、コンテナ化テクノロジがますます人気のある展開方法になっています。最も人気のあるコンテナ化ソリューションの 1 つである Docker は、開発者に便利な環境分離および展開方法を提供します。 Kafka をメッセージ キュー システムとして使用する開発者は、Kafka と Docker を組み合わせることで、開発とデプロイメントをより柔軟かつ効率的に行うことができます。この記事では、コンテナ化によってもたらされる利便性を簡単に享受できるように、PHP エディターの Xigua が Docker で Kafka を実行する方法を紹介します。

質問の内容

Confluence ドキュメント (手順 2 ~ 3) の説明に従って、ローカル マシン上に単一ノードの Kafka Docker コンテナをセットアップしました。

さらに、ローカル マシンで実行されているクライアントから接続できるように、Zookeeper のポート 2181 と Kafka のポート 9092 を公開しました。 リーリー

問題: ホストから kafka に接続しようとすると、 アドレス: kafka:9092 を解決できないため、接続が失敗します。

これは私の Java コードです:

リーリー ###例外:### リーリー

質問:

Docker で実行されている Kafka に接続するにはどうすればよいですか?私のコードはDockerではなくホストから実行されています。

注: 理論的には、DNS 設定と /etc/hosts

を試すことができることはわかっていますが、これは回避策です。このようにはならないはずです。

ここにも同様の質問がありますが、ches/kafka

イメージに基づいています。

confluenceinc に基づいた画像を使用していますが、これは異なります。 回避策

tl;dr

- コンテナからホストへの単純なポート転送は

機能しません ... hosts ファイル (例: * NIX システム上の /etc/hosts) は、このソリューションは移植性がないため、Kafka ネットワークの問題を解決するために変更しないでください。 1) 接続する正確な IP/ホスト名ポートはどれですか?プロキシ上の値が advertished.listeners

に設定されていることを確認してください (

advertished.host.nameadvertished.port は非推奨のため、これらには設定されません)。 Connection to node -1 (localhost/127.0.0.1:9092) のようなエラーが表示された場合は、アプリケーション コンテナーがそれ自体に接続しようとしていることを意味します。アプリケーション コンテナーでも Kafka ブローカー プロセスが実行されていますか?そうでないかもしれない。 2) bootstrap.servers

の一部としてリストされているサーバーが実際に解決可能であることを確認してください。例:

ping IP/ホスト名、netcat を使用してポートを確認します...クライアントがコンテナ内にある場合は、これをコンテナ (のみ) からではなく、コンテナから行う必要があります。ホスト これを実行してください。コンテナーがすぐにクラッシュしてシェルにアクセスできない場合は、docker exec を使用します。 3) 別のコンテナではなくホストからプロセスを実行する場合、ポートがホストに正しくマッピングされていることを確認するには、docker ps

が Kafka コンテナが

からマッピングされていることを確認してください。 0.0.0.0: -> /tcp。Docker ネットワークの外部からクライアントを実行しようとする場合、ポートが一致する必要があります。 2 つのコンテナ間でポート転送は必要ありません。link/docker-network を使用してください。 以下の回答では、confluenceinc

docker イメージを使用して、発生した問題を解決しています。

wurstmeister/kafka ではありません。 KAFKA_ADVERTISED_HOST_NAME 変数を設定した場合は、それを削除します (これは非推奨のプロパティです) 次のセクションでは、他の画像を使用するために必要なすべての詳細を要約します。その他の一般的に使用される Kafka イメージの場合、 はすべてコンテナ Apache

Kafka

で実行されます。 どのように構成されているかにのみ依存します。そして、どの変数
がこれを引き起こしているのか。 ヴルストマイスター/カフカ

2023 年 10 月の時点で、このコンテンツは DockerHub に存在しません。いずれにしても2022年以降は維持されないことになる。 リスナー設定に関する Readme セクション

を参照してください。また

接続性 wiki

もお読みください。

a>ビットナミ/カフカ

小さな容器が必要な場合は、これらを試してください。イメージは Confluence よりもはるかに小さく、

wurstmeister よりもよく管理されています。 リスナー構成については、Readme ファイル

を参照してください。

デベジウム/カフカ

関連ドキュメントについては、

こちらを参照してください。

NOTE: アドバタイズされたホストとポートの設定は非推奨になりました。 Advertisinglistener では両方をカバーしています。 Confluence コンテナと同様に、Debezium は KAFKA_ というプレフィックスが付いたプロキシ設定を使用してプロパティを更新できます。

###他の###

    ubuntu/kafka
  • Docker イメージ パラメーター経由で --overrideadvertising.listeners=kafka:9092 を追加する必要があります...環境変数より移植性が低いと思うので、お勧めしません
  • spotify/kafka
  • 非推奨となり廃止されました。
  • fast-data-dev
  • または lensesio/box は、スキーマ レジストリ、Kafka Connect などを備えたオールインワン ソリューションに最適ですが、のみ Kafkaが必要な場合は、肥大化しているように見えます。また、これはコンテナ内で複数のサービスを実行する場合の Docker のアンチパターンです 独自の
  • Dockerfile
  • - なぜですか?他のものは不完全ですか?最初から始めるのではなく、プルリクエストから始めてください。
  • 追加の資料、
全機能

docker-composeおよびネットワーク図については、このブログの執筆者: @rmoff を参照してください。 ###答え###

Confluence クイック スタート (Docker) ドキュメント

すべての生成リクエストと消費リクエストは Docker ネットワーク内で発生すると想定されています。

kafka:9092 への接続の問題は、(Docker ブリッジを使用して) 独自のコンテナーで Kafka クライアント コードを実行することで回避できますが、それ以外の場合は、環境変数をコンテナ Docker ネットワーク内で動作しながら、外部の世界に公開されます。

最初に、PLAINTEXT_HOST:PLAINTEXT のプロトコル マッピングを追加します。これは、リスナー プロトコルを Kafka プロトコルにマップします。

キー:

KAFKA_LISTENER_SECURITY_PROTOCOL_MAP 値:

PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT

次に、異なるポート上に 2 つのアドバタイズされたリスナーを設定します。 (ここでの
kafka は Docker コンテナ名を指します。broker

という名前の場合もあるので、サービスのホスト名を再確認してください)。

キー:KAFKA_ADVERTISED_LISTENERS 値:

PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092


ここでのプロトコルは、上記のプロトコル マッピング設定の左側の値と一致することに注意してください。

コンテナの実行時に、ホスト ポート マッピングに

-p 29092:29092 を追加し、PLAINTEXT_HOST

リスナーに通知します。

つまり...(上記の設定を使用します)

それでも

が機能しない場合は、KAFKA_LISTENERS

://0.0.0.0:

を含めるように設定できます。どちらのオプションも広告設定と Docker 転送ポートに一致します クライアントはコンテナ内ではなく、同じマシン上にあります ローカルホストと関連ポートをアドバタイズすると、ご想像のとおり、コンテナの外部に接続できるようになります。 つまり、Docker ネットワークの外部で Kafka クライアントを実行する場合 (ローカルにインストールした CLI ツールを含む)、

localhost:2181 を使用して、ブートストラップ サーバーとして

localhost:29092

を使用します。

Zookeeper として (Docker が必要) ポート転送)

別のマシン上のクライアント 外部サーバーから接続しようとしている場合は、ホストの外部ホスト名/IP (例: 192.168.x.y)

および localhost

# の代わりに / をアドバタイズする必要があります。 ##。

Kafka プロトコルは構成済みのリスナーを引き続きアドバタイズするため、ポート転送を介して localhost をアドバタイズするだけでは機能しません。 この設定では、同じローカル ネットワーク内にない場合、Docker ポート転送 および ルーター ポート転送 (およびファイアウォール/セキュリティ グループの変更) が必要です。たとえば、コンテナがクラウドで実行されており、そこから操作したい場合などです。ローカルコンピュータ。 同じホスト上のコンテナ内のクライアント (または別のプロキシ)

これは最もエラーが発生しにくい構成です。DNS サービス名を直接使用できます。

Docker ネットワーク でアプリケーション

を実行する場合は、ブートストラップ サーバーとして

kafka:9092

(上記の

PLAINTEXT

リスナー構成を参照) を使用します。# を使用します。 ##zookeeper:2181

Zookeeper として、他の Docker サービス通信と同様 (ポート転送は必要ありません) 別の docker run コマンドまたは Compose ファイルを使用する場合は、compose networks セクションまたは docker network --create# を使用して共有を手動で定義する必要があります。 ## ## #通信網######

完全な Confluence スタックについてはサンプル Compose ファイル

を、単一ブローカーについては より単純な を参照してください。 <p> 複数のプロキシを使用する場合は、リスナーのアドバタイズに一意のホスト名を使用する必要があります。 <a href="https://www.php.cn/link/38a8e18d75e95ca619af8df0da1417f2" rel="nofollow noreferrer">例を見る一个></a></p> <h1>関連する質問</h1> <p><a href="https://www.php.cn/link/d6b6536a9a9352f17189a9dff2f569b6">Docker (ksqlDB) からホスト上の Kafka に接続する </a># ###付録### </p>Kubernetes<h1> デプロイメントに興味のある方: </h1> <p> <strong></strong>Kafka にアクセスする </p> <ul>#演算子 (推奨): <li>https://www.php.cn/link/61b07251e835d37322b7460d2b88c05b<a href="https://www.php.cn/link/792b765aa995daf26cf6f17f519c949d" rel="nofollow noreferrer"></a> </li>Helm アーティファクト ハブ: <li>https://artifacthub.io/packages/search ?ts_query_web=kafka&sort=stars&page=1<a href="https://www.php.cn/link/61b07251e835d37322b7460d2b88c05b" rel="nofollow noreferrer"></a> </li> </ul>

以上がDocker で実行されている Kafka に接続しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。