zookeeper:
image: wurstmeister/zookeeper:latest
platform: linux/amd64
ports:
- "2181:2181"
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
networks:
- image_network
kafka:
image: wurstmeister/kafka:latest
platform: linux/amd64
ports:
- "29092:29092"
- "9092:9092"
environment:
KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:9092,OUTSIDE://kafka:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
KAFKA_LISTENERS: INSIDE://0.0.0.0:9092,OUTSIDE://0.0.0.0:29092
KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- image_network
depends_on:
- zookeeper
kafka-ui:
image: provectuslabs/kafka-ui:latest
platform: linux/amd64
ports:
- "8080:8080"
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:29092
KAFKA_CLUSTERS_0_ZOOKEEPER: zookeeper:2181
KAFKA_CLUSTERS_0_READONLY: "false"
networks:
- image_network
- KAFKA_ADVERTISED_LISTENERS:
- 외부에서 접속하기 위한 리스너 설정을 한다.
- 카프카 프로듀서, 컨슈머에게 노출할 주소
- 설정하지 않을 경우 listeners 설정이 적용된다.
- key:value 형식
- 이때 INSIDE와 OUTSIDE는 정해진 키워드가 아니다.
- KAFKA_LISTENER_SECURITY_PROTOCOL_MAP:
- 보안을 위한 프로토콜 매핑
- KAFKA_ADVERTISED_LISTENERS 과 함께 key/value로 매핑된다.
- KAFKA_LISTENERS
- 카프카 브로커가 내부적으로 바인딩하는 주소
- KAFKA_INTER_BROKER_LISTENER_NAME:
- 내부에서 사용할 리스너 이름을 지정한다.
- 이전에 매핑된 PLAINTEXT가 사용되었다.
❓KAFKA_ADVERTISED_LISTENERS와 KAFKA_LISTENERS의 차이점
KAFKA_ADVERTISED_LISTENERS는 브로커가 리스닝하는 포트를 외부 세계로 연결하는 역할을 한다.
카프카는 클러스터 환경이라 Private Network 내부에서 동작하는데, 내부 네트워크를 외부로 연결 시키는 역할을 하는 것이 KAFKA_ADVERTISED_LISTENERS이다.
KAFKA_LISTENERS를 통해 브로커의 네트워크 포트를 활성화시키고, 그 포트 정보를 토대로 KAFKA_ADVERTISED_LISTENERS를 활용하여 다른 서버들과 소통한다.
개별 브로커는 1. 다른 브로커 2. 메시지 프로듀서 or 컨슈머 와 통신을 하게되는데,
1번은 내부 통신
2번은 외부 통신이라 할 수 있겠다.
그러므로, KAFKA_INTER_BROKER_LISTENER_NAME로 INSIDE를 설정하게 되면
내부 브로커들의 통신은 kafka:9092
클라이언트(메시지 프로듀서와 컨슈머) 통신은 kafka:29092로 정해지는 것이다.
스프링 애플리케이션 yml 파일에 아래와 같이 설정하면 된다.
kafka:
bootstrap-servers: kafka:29092
👩🌾삽질의 원인
우선.,. INSIDE가 도커 컨테이너끼리의 통신이고 OUTSIDE가 아예 외부??통신인줄 알았다..
OUTSIDE://localhost:29092 로 설정하고
INSIDE로 설정한 주소만 계속 시도했더니..타임아웃이 났다!
클라이언트쪽에서 내부통신 포트를 요청하니 그랬던거 같다.
생각보다 단순한 문제였는데 개념을 제대로 알지 못하는 상황에서 gpt에 의존하다보니 시간이 오래 소요되었다..
이제 확실히 알았으니 다음부턴 조심하자
참고
https://www.sktenterprise.com/bizInsight/blogDetail/dev/2565
'TIL' 카테고리의 다른 글
Docker : no space left on device (0) | 2024.10.22 |
---|---|
[TIL 2024/10/15] MSA 프로젝트 Docker로 실행하기 (0) | 2024.10.16 |
[WIL] 프로젝트 2주차 (0) | 2024.10.07 |
[TIL 2024/10/01] docker db 연결 오류 (1) | 2024.10.03 |
[TIL 2024/09/30] 이미지 서버 모듈 (1) | 2024.10.01 |