>  기사  >  백엔드 개발  >  Docker에서 실행 중인 Kafka에 연결

Docker에서 실행 중인 Kafka에 연결

PHPz
PHPz앞으로
2024-02-14 23:42:08951검색

连接到在 Docker 中运行的 Kafka

오늘날의 소프트웨어 개발 분야에서 컨테이너화 기술은 점점 더 대중적인 배포 방법이 되었습니다. 가장 널리 사용되는 컨테이너화 솔루션 중 하나인 Docker는 개발자에게 편리한 환경 격리 및 배포 방법을 제공합니다. Kafka를 메시지 큐 시스템으로 사용하는 개발자의 경우 Kafka와 Docker를 결합하면 개발 및 배포가 더욱 유연하고 효율적으로 이루어질 수 있습니다. 이 기사에서는 PHP 편집자 Xigua가 Docker에서 Kafka를 실행하는 방법을 소개하여 컨테이너화로 인한 편리함을 쉽게 누릴 수 있습니다.

질문 내용

confluence 문서(2~3단계)에 설명된 대로 로컬 컴퓨터에 단일 노드 kafka docker 컨테이너를 설정했습니다.

또한 내 로컬 컴퓨터에서 실행되는 클라이언트에서 연결할 수 있도록 Zookeeper의 포트 2181과 Kafka의 포트 9092를 노출했습니다.

으아악

문제: 호스트에서 kafka에 연결하려고 하면 연결이 실패합니다. 이유는 无法解析地址:kafka:9092.

이것은 내 자바 코드입니다:

으아악

예외:

으아악

질문: Docker에서 실행 중인 kafka에 연결하는 방법은 무엇입니까? 내 코드는 Docker가 아닌 호스트에서 실행됩니다.

참고: 이론적으로는 DNS 설정을 시도해 볼 수 있다는 것을 알고 있으며 /etc/hosts 하지만 이는 해결 방법입니다. 이렇지는 않아야 합니다.

여기에도 비슷한 질문이 있는데 ches/kafka 이미지를 기반으로 한 것입니다. 나는 confluenceinc 기반의 이미지를 사용하는데 이것은 다릅니다. ches/kafka 图像。我使用基于 confluenceinc 的图像,这是不一样的。

解决方法

tl;dr - 从容器到主机的简单端口转发将不起作用...主机文件(例如 *NIX 系统上的 /etc/hosts

해결 방법

advertished.listeners (不是 advertished.host.nameadvertished.port,因为这些已被弃用)。如果您看到诸如 Connection to node -1 (localhost/127.0.0.1:9092)

tl;dr

- 컨테이너에서 호스트로의 단순 포트 전달은 bootstrap.servers 一部分列出的服务器实际上是可解析的。例如 ping IP/主机名,使用 netcat 检查端口...如果您的客户端位于容器中,则需要从容器执行此操作,而不是(仅)从主机执行此操作。如果容器没有立即崩溃以访问其 shell,请使用 docker exec작동하지 않습니다

... Kafka 네트워크 문제를 해결하기 위해 호스트 파일(예: *NIX 시스템의

)을 수정해서는 안 됩니다. 가지고 다닐 수 있는. docker ps 显示 kafka 容器是从 0.0.0.0 映射的:<host_port> -> <advertished_listener_port> /tcp

1) 정확히 어느 IP/호스트 이름 + 포트에 연결하시겠습니까? 프록시에서 값이

로 설정되어 있는지 확인하세요. confluenceinc docker 镜像来解决所提出的问题,不是 wurstmeister/kafka。如果您设置了 KAFKA_ADVERTISED_HOST_NAME와 같은 오류는 애플리케이션 컨테이너가 자체적으로 연결을 시도하고 있음을 의미합니다. 애플리케이션 컨테이너도 Kafka 브로커 프로세스를 실행하고 있나요? 아마.

2) 로 보장합니다. 3) 다른 컨테이너 대신 호스트에서 프로세스를 실행하는 경우 포트가 호스트에 올바르게 매핑되었는지 확인하려면 Docker 네트워크 외부에서 클라이언트를 실행하려는 경우 포트가 일치해야 합니다. 두 컨테이너 간에 포트 전달이 필요하지 않습니다. 링크/도커 네트워크를 사용하세요.
아래 답변은 제기된 문제를 해결하기 위해 confluenceinc docker 이미지를 사용합니다. 아님 . KAFKA_ADVERTISED_HOST_NAME 변수를 설정한 경우 이를 제거하십시오(더 이상 사용되지 않는 속성입니다)

다음 섹션에서는 다른 이미지를 사용하는 데 필요한 모든 세부 사항을 요약합니다. 일반적으로 사용되는 다른 Kafka 이미지의 경우 wurstmeister/kafka모두 컨테이너

Apache

Kafka

에서 실행됩니다.

구성 방법 a>에만 의존할 수 있습니다. 그리고 어떤 변수가 이 문제를 일으키는지.

bitnami/kafka

2023년 10월 현재 이 콘텐츠는 DockerHub에 더 이상 존재하지 않습니다. 어쨌든 2022년 이후에는 유지보수가 없습니다. wurstmeister 리스너 구성에 대한 추가 정보 섹션 을 참조하고

Connectivity wiki

도 읽어보세요. debezium/kafka

작은 용기를 원한다면 이것을 사용해 보세요. 이미지는 Confluence보다 훨씬 작고

보다 유지 관리가 더 좋습니다. 🎜리스너 구성은 Readme 파일을 참조하세요🎜. 🎜 🎜🎜🎜 관련 문서는 🎜여기🎜여기🎜에 언급되어 있습니다. 🎜

NOTE: 게시된 호스트 및 포트 설정은 더 이상 사용되지 않습니다. 광고 Listeners는 둘 다 다룹니다. Confluence 컨테이너와 마찬가지로 Debezium은 KAFKA_ 접두사가 붙은 프록시 설정을 사용하여 속성을 업데이트할 수 있습니다.

기타

  • ubuntu/kafka 要求您通过 Docker 映像参数添加 --overrideadvertising.listeners=kafka:9092...환경 변수에 비해 이식성이 떨어지므로 권장하지 않습니다
  • spotify/kafka 더 이상 사용되지 않으며 더 이상 사용되지 않습니다.
  • fast-data-devlensesio/box 스키마 레지스트리, Kafka Connect 등이 포함된 올인원 솔루션에 적합하지만 Kafka를 원하는 경우에는 비대해집니다. 또한 이는 컨테이너에서 여러 서비스를 실행하기 위한 Docker 안티 패턴입니다
  • 나만의 Dockerfile - 왜요? 다른 것들은 불완전합니까? 처음부터 시작하는 대신 풀 요청으로 시작하세요.

자세한 내용은 모든 기능을 갖춘 docker-compose 및 네트워크 다이어그램을 참조하세요. 이 블로그 작성자: @rmoff

답변

Confluence Quick Start(Docker) 문서에서는 모든 생산 및 소비 요청이 Docker 네트워크 내에서 발생한다고 가정합니다.

자체 컨테이너에서 Kafka 클라이언트 코드를 실행하여(Docker 브리지 사용) kafka:9092에 연결하는 문제를 해결할 수 있지만, 그렇지 않으면 컨테이너를 외부에 노출시키면서 더 많은 환경 변수를 추가해야 합니다. 네트워크의 Docker Work에서 실행됩니다.

먼저 리스너 프로토콜을 Kafka 프로토콜에 매핑하는 PLAINTEXT_HOST:PLAINTEXT의 프로토콜 매핑을 추가하세요

키: KAFKA_LISTENER_SECURITY_PROTOCOL_MAP
값: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT

그런 다음 서로 다른 포트에 두 개의 광고 수신기를 설정합니다. (kafka 指的是 docker 容器名称;它也可能被命名为 broker 여기에서는 서비스 + 호스트 이름을 다시 확인하세요).

키: KAFKA_ADVERTISED_LISTENERS
값: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092

여기의 프로토콜은 위의 프로토콜 매핑 설정 왼쪽 값과 일치한다는 점에 유의하세요

컨테이너를 실행할 때 -p 29092:29092 进行主机端口映射,并通告 PLAINTEXT_HOST 리스너를 추가하세요.

그러니까...(위 설정을 활용)

그래도 작동하지 않으면 두 옵션 모두 AD 설정 및 Docker 전달 포트와 일치하도록 KAFKA_LISTENERS 设置为包含 <PROTOCOL>://0.0.0.0:<PORT> 변경할 수 있습니다

클라이언트는 컨테이너가 아닌 동일한 머신에 있습니다

로컬 호스트 및 관련 포트를 광고하면 예상한 대로 컨테이너 외부에 연결할 수 있습니다.

즉, Docker 네트워크 외부에서 Kafka 클라이언트(로컬에 설치했을 수 있는 CLI 도구 포함)를 실행할 때 localhost:29092 作为引导服务器,使用 localhost:2181를 Zookeeper로 사용하세요(Docker 포트 전달 필요)

다른 컴퓨터의 클라이언트

외부 서버에서 연결을 시도하는 경우 호스트의 외부 호스트 이름/IP(예: 192.168.x.y) 는 물론/localhost 대신 광고해야 합니다.
단순히 포트 전달을 통해 로컬 호스트를 광고하는 것은 Kafka 프로토콜이 구성된 수신기를 계속해서 광고하기 때문에 작동하지 않습니다.

이 설정에는 동일한 로컬 네트워크에 있지 않은 경우 Docker 포트 전달 라우터 포트 전달(및 방화벽/보안 그룹 변경)이 필요합니다. 예를 들어 컨테이너가 클라우드에서 실행되고 있고 로컬 시스템에서 상호 작용하려는 경우입니다.

동일한 호스트의 컨테이너에 있는 클라이언트(또는 다른 프록시)

이것은 DNS 서비스 이름을 직접 사용할 수 있는 오류가 가장 적은 구성입니다.

Docker 네트워크 에서 애플리케이션 을 실행하는 경우 kafka:9092 (请参阅上面广告的 PLAINTEXT 侦听器配置)作为引导服务器,使用 zookeeper:2181(위에 광고된 PLAINTEXT 리스너 구성 참조)를 부트스트랩 서버로 사용하고 zookeeper:2181를 Zookeeper로 사용하세요. 다른 Docker 서비스 통신과 마찬가지로(포트 전달이 필요하지 않음)

별도 사용하는 경우 docker run 命令或 Compose 文件,则需要使用 compose networks 部分或 docker network --create 手动定义共享 network

전체 Confluence 스택에 대한 Compose 파일 예시를 확인하세요 또는 단일 브로커에 대한 더 간단한 스택의 경우.

여러 프록시를 사용하는 경우 고유한 호스트 이름과 광고 리스너를 사용해야 합니다. 예시 보기一个>

관련 질문

Docker(ksqlDB)에서 호스트의 Kafka에 연결

부록

Kubernetes 배포에 관심이 있는 모든 사람:

위 내용은 Docker에서 실행 중인 Kafka에 연결의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제