도커 환경에서 카프카와 주키퍼
도커 환경에서 카프카와 주키퍼 구축시에 사용할 이미지를 먼저 선택해야한다.

도커 명령어를 통해 주키퍼와 카프카에 관련된 이미지를 검색한 결과,
주키퍼는 공식 이미지가 있지만, 카프카는 공식 이미지가 없음을 확인 할 수 있다.
카프카 이미지 특징
1. dockerkafka/kafka
- Docker hub 바로가기
- kafka외에도 zookeeper, kafka-manager 솔루션 제공
- 데이터 플랫폼 최강자 책 참고 가능. (2페이지정도 분량이긴 하지만..)
- 4년전에 업데이트 되어, 최신 docker-compose version은 참고가 어려움.
2. bitnami/kafka
- Docker hub 바로가기
- bitnami 회사에서 지원
- kafka, zookeeper도 한꺼번에 사용가능.
- 최신 릴리즈 빠르게 적용
- 레퍼런스 풍부
- 하지만 커스텀화 하게 되면 상업용 버전을... 점점 권유하는 것 같은 느낌을 받는다..
3. confluentinc/kafka ***
- Confluent Document 바로가기
- kafka를 만든 회사에서 docker에서 사용하는 방법 직접 가이드함.
- docker-compose 활용 레퍼런스 바로 가기
- 개인적으로 zookeeper는 official 이미지를 사용하고, kafka는 따로 confluentinc/cp-kafka를 사용하는 것을 추천
- 이렇게 사용할때, 버전에 주의해야한다..!
- 필자는 zookeeper:3.5.0 과 confluentinc/cp-kafka:5.5.0 을 함께 사용하려고 했을때 서로 연동하는데 에러가 발생하였다. (정확한 원인은 모르겠다.. 라이브러리를 가져다가 쓰는 입장이기에..)
- 그래서 zookeeper:3.4.9, confluentinc/cp-kafka:5.5.0 이렇게 사용하고 있다.
- 참고 : [DataSicence/Kafka] - [kafka] multi-node zookeeper & kafka docker-compose.yml file
wurstmeister/zookeeper, wurstmeister/kafka 등 비공식적인 카프카 이미지가 다양하게 존재한다.
본격적으로 하는건 confluentinc (유료/보안) / 가볍게 하는건 wurstmeister 많이들 선택 하는것 같다.
도커 컴포즈를 이용하여 Single Broker 구성하기
Docker-compose.yml
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
hostname: zookeeper
container_name: zookeeper-1
volumes:
- 마운트할경로:/opt/zookeeper/conf/
- 마운트할경로:/opt/zookeeper/logs
ports:
- 2181:2181
networks:
- log-network
kafka-1:
image: wurstmeister/kafka
hostname: kafka-1
depends_on:
- zookeeper
container_name: kafka-1
volumes:
- 마운트할경로/:/opt/kafka/config/
- 마운트할경로:/opt/kafka/logs
environment:
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: INTERNAL://:19092,EXTERNAL://:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-1:19092,EXTERNAL://kafka-1:9092
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
networks:
- log-network
kafka-2:
image: wurstmeister/kafka
hostname: kafka-2
depends_on:
- zookeeper
container_name: kafka-2
volumes:
- 마운트할경로:/opt/kafka/config/
- 마운트할경로:/opt/kafka/logs
environment:
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: INTERNAL://:29092,EXTERNAL://:9093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-2:29092,EXTERNAL://kafka-2:9093
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
networks:
- log-network
kafka-3:
image: wurstmeister/kafka
hostname: kafka-3
depends_on:
- zookeeper
container_name: kafka-3
volumes:
- 마운트할경로:/opt/kafka/config/
- 마운트할경로:/opt/kafka/logs
environment:
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: INTERNAL://:39092,EXTERNAL://:9094
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-3:39092,EXTERNAL://kafka-3:9094
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
networks:
- log-network
cmak:
image: hlebalbau/kafka-manager:stable
restart: always
depends_on:
- kafka-1
- kafka-2
- kafka-3
- zookeeper
ports:
- 9000:9000
environment:
- "-Dcmak.zkhosts=zookeeper:2181"
- "-DbasicAuthentication.enabled=true"
- "-DbasicAuthentication.username=admin"
- "-DbasicAuthentication.password=password"
networks:
- log-network
networks:
log-network:
name: log-network
driver: bridge
Zookeeper environment 옵션
- ZOOKEEPER_SERVER_ID:
- zookeeper 클러스터에서 유일하게 주키퍼를 식별할 아이디이다.
- 동일 클러스터 내에서 이 값은 중복되면 안된다. 단일 브로커이기 때문에 이 값은 의미가 없다.
- ZOOKEEPER_CLIENT_PORT:
- zookeeper_client_port를 지정한다. 여기서는 기본 주키퍼의 포트인 2181로 지정한다.
- 즉 컨테이너 내부에서 주키퍼는 2181로 실행된다.
- ZOOKEEPER_TICK_TIME:
- zookeeper이 클러스터를 구성할때 동기화를 위한 기본 틱 타임을 지정한다.
- millisecond로 지정할 수 있으며 여기서는 2000으로 설정했으니 2초가 된다.
- ZOOKEEPER_INIT_LIMIT:
- 주키퍼 초기화를 위한 제한 시간을 설정한다.
- 주키퍼 클러스터는 쿼럼이라는 과정을 통해서 마스터를 선출하게 된다. 이때 주키퍼들이 리더에게 커넥션을 맺을때 지정할 초기 타임아웃 시간이다.
- 타임아웃 시간은 이전에 지정한 ZOOKEEPER_TICK_TIME 단위로 설정된다.
- 우리는 ZOOKEEPER_TICK_TIME을 2000으로 지정했고, ZOOKEEPER_INIT_LIMIT을 5로 잡았으므로 2000 * 5 = 10000 밀리세컨이 된다. 즉, 10초가 된다.
- 이 옵션은 멀티 브로커에서 유효한 속성이다.
- ZOOKEEPER_SYNC_LIMIT:
- 이 시간은 주키퍼 리더와 나머지 서버들의 싱크 타임이다.
- 이 시간내 싱크응답이 들어오는 경우 클러스터가 정상으로 구성되어 있늠을 확인하는 시간이다.
- 여기서 2로 잡았으므로 2000 * 2 = 4000 으로 4초가 된다.
- 이 옵션은 멀티 브로커에서 유효한 속성이다.
Kafka environment 옵션
- KAFKA_BROKER_ID:
- kafka 브로커 아이디를 지정한다. 유니크해야하며 지금 예제는 단일 브로커는 없어도 무방하다
- KAFKA_ZOOKEEPER_CONNECT:
- kafka가 zookeeper에 커넥션하기 위한 대상을 지정한다.
- 여기서는 zookeeper(서비스이름):2181(컨테이너내부포트) 로 대상을 지정했다.
- KAFKA_ADVERTISED_LISTENERS:
- 외부에서 접속하기 위한 리스너 설정을 한다.
- KAFKA_LISTENER_SECURITY_PROTOCOL_MAP:
- 보안을 위한 프로토콜 매핑이디. 이 설정값은 KAFKA_ADVERTISED_LISTENERS 과 함께 key/value로 매핑된다.
- KAFKA_INTER_BROKER_LISTENER_NAME:
- 도커 내부에서 사용할 리스너 이름을 지정한다.
- 이전에 매핑된 PLAINTEXT가 사용되었다.
- KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR:
- single 브로커인경우에 지정하여 1로 설정했다.
- 멀티 브로커는 기본값을 사용하므로 이 설정이 필요 없다.
- KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS:
- 카프카 그룹이 초기 리밸런싱할때 컨슈머들이 컨슈머 그룹에 조인할때 대기 시간이다.
CMAK ( Kafka Manager )
Kafka Manager는 yahoo에서 제작한 GUI 기반 카프카 관리 도구로, 웹 환경에서 클러스터, 토픽 등의 생성 및 변경, consumer group 확인 등의 작업을 웹 환경에서 확인하고 진행할 수 있다. 사실 CLI 환경에서도 Kafka를 관리할 수 있으나 편의적인 측면에서 많은 기업들이 kafka-manager 를 도입하여 운용중이다.
💡 주요기능
a) Kafka Cluster 관리(모니터링)
b) Consumer Lag 관리(모니터링)
c) 파티션 Rebalance: 파티션 추가
d) 토픽 관리: 리스트 조회, 생성&삭제
+Details: https://github.com/yahoo/CMAK#deployment
GitHub - yahoo/CMAK: CMAK is a tool for managing Apache Kafka clusters
CMAK is a tool for managing Apache Kafka clusters. Contribute to yahoo/CMAK development by creating an account on GitHub.
github.com
docker-compose up -d

'개-발 > Infra' 카테고리의 다른 글
[NCP] Ncp kafka VM 생성 (0) | 2023.06.12 |
---|---|
[Kafka] 카프카 Console 명령어 (0) | 2023.06.08 |
[Kafka] Kafka 란 ? (0) | 2023.06.07 |
[Kafka] Zookeeper 란? (1) | 2023.06.07 |
[Elastic] 한글형태소 분석기 (nori 설치) (2) | 2023.06.03 |
도커 환경에서 카프카와 주키퍼
도커 환경에서 카프카와 주키퍼 구축시에 사용할 이미지를 먼저 선택해야한다.

도커 명령어를 통해 주키퍼와 카프카에 관련된 이미지를 검색한 결과,
주키퍼는 공식 이미지가 있지만, 카프카는 공식 이미지가 없음을 확인 할 수 있다.
카프카 이미지 특징
1. dockerkafka/kafka
- Docker hub 바로가기
- kafka외에도 zookeeper, kafka-manager 솔루션 제공
- 데이터 플랫폼 최강자 책 참고 가능. (2페이지정도 분량이긴 하지만..)
- 4년전에 업데이트 되어, 최신 docker-compose version은 참고가 어려움.
2. bitnami/kafka
- Docker hub 바로가기
- bitnami 회사에서 지원
- kafka, zookeeper도 한꺼번에 사용가능.
- 최신 릴리즈 빠르게 적용
- 레퍼런스 풍부
- 하지만 커스텀화 하게 되면 상업용 버전을... 점점 권유하는 것 같은 느낌을 받는다..
3. confluentinc/kafka ***
- Confluent Document 바로가기
- kafka를 만든 회사에서 docker에서 사용하는 방법 직접 가이드함.
- docker-compose 활용 레퍼런스 바로 가기
- 개인적으로 zookeeper는 official 이미지를 사용하고, kafka는 따로 confluentinc/cp-kafka를 사용하는 것을 추천
- 이렇게 사용할때, 버전에 주의해야한다..!
- 필자는 zookeeper:3.5.0 과 confluentinc/cp-kafka:5.5.0 을 함께 사용하려고 했을때 서로 연동하는데 에러가 발생하였다. (정확한 원인은 모르겠다.. 라이브러리를 가져다가 쓰는 입장이기에..)
- 그래서 zookeeper:3.4.9, confluentinc/cp-kafka:5.5.0 이렇게 사용하고 있다.
- 참고 : [DataSicence/Kafka] - [kafka] multi-node zookeeper & kafka docker-compose.yml file
wurstmeister/zookeeper, wurstmeister/kafka 등 비공식적인 카프카 이미지가 다양하게 존재한다.
본격적으로 하는건 confluentinc (유료/보안) / 가볍게 하는건 wurstmeister 많이들 선택 하는것 같다.
도커 컴포즈를 이용하여 Single Broker 구성하기
Docker-compose.yml
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
hostname: zookeeper
container_name: zookeeper-1
volumes:
- 마운트할경로:/opt/zookeeper/conf/
- 마운트할경로:/opt/zookeeper/logs
ports:
- 2181:2181
networks:
- log-network
kafka-1:
image: wurstmeister/kafka
hostname: kafka-1
depends_on:
- zookeeper
container_name: kafka-1
volumes:
- 마운트할경로/:/opt/kafka/config/
- 마운트할경로:/opt/kafka/logs
environment:
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: INTERNAL://:19092,EXTERNAL://:9092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-1:19092,EXTERNAL://kafka-1:9092
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
networks:
- log-network
kafka-2:
image: wurstmeister/kafka
hostname: kafka-2
depends_on:
- zookeeper
container_name: kafka-2
volumes:
- 마운트할경로:/opt/kafka/config/
- 마운트할경로:/opt/kafka/logs
environment:
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: INTERNAL://:29092,EXTERNAL://:9093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-2:29092,EXTERNAL://kafka-2:9093
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
networks:
- log-network
kafka-3:
image: wurstmeister/kafka
hostname: kafka-3
depends_on:
- zookeeper
container_name: kafka-3
volumes:
- 마운트할경로:/opt/kafka/config/
- 마운트할경로:/opt/kafka/logs
environment:
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: INTERNAL://:39092,EXTERNAL://:9094
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka-3:39092,EXTERNAL://kafka-3:9094
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
networks:
- log-network
cmak:
image: hlebalbau/kafka-manager:stable
restart: always
depends_on:
- kafka-1
- kafka-2
- kafka-3
- zookeeper
ports:
- 9000:9000
environment:
- "-Dcmak.zkhosts=zookeeper:2181"
- "-DbasicAuthentication.enabled=true"
- "-DbasicAuthentication.username=admin"
- "-DbasicAuthentication.password=password"
networks:
- log-network
networks:
log-network:
name: log-network
driver: bridge
Zookeeper environment 옵션
- ZOOKEEPER_SERVER_ID:
- zookeeper 클러스터에서 유일하게 주키퍼를 식별할 아이디이다.
- 동일 클러스터 내에서 이 값은 중복되면 안된다. 단일 브로커이기 때문에 이 값은 의미가 없다.
- ZOOKEEPER_CLIENT_PORT:
- zookeeper_client_port를 지정한다. 여기서는 기본 주키퍼의 포트인 2181로 지정한다.
- 즉 컨테이너 내부에서 주키퍼는 2181로 실행된다.
- ZOOKEEPER_TICK_TIME:
- zookeeper이 클러스터를 구성할때 동기화를 위한 기본 틱 타임을 지정한다.
- millisecond로 지정할 수 있으며 여기서는 2000으로 설정했으니 2초가 된다.
- ZOOKEEPER_INIT_LIMIT:
- 주키퍼 초기화를 위한 제한 시간을 설정한다.
- 주키퍼 클러스터는 쿼럼이라는 과정을 통해서 마스터를 선출하게 된다. 이때 주키퍼들이 리더에게 커넥션을 맺을때 지정할 초기 타임아웃 시간이다.
- 타임아웃 시간은 이전에 지정한 ZOOKEEPER_TICK_TIME 단위로 설정된다.
- 우리는 ZOOKEEPER_TICK_TIME을 2000으로 지정했고, ZOOKEEPER_INIT_LIMIT을 5로 잡았으므로 2000 * 5 = 10000 밀리세컨이 된다. 즉, 10초가 된다.
- 이 옵션은 멀티 브로커에서 유효한 속성이다.
- ZOOKEEPER_SYNC_LIMIT:
- 이 시간은 주키퍼 리더와 나머지 서버들의 싱크 타임이다.
- 이 시간내 싱크응답이 들어오는 경우 클러스터가 정상으로 구성되어 있늠을 확인하는 시간이다.
- 여기서 2로 잡았으므로 2000 * 2 = 4000 으로 4초가 된다.
- 이 옵션은 멀티 브로커에서 유효한 속성이다.
Kafka environment 옵션
- KAFKA_BROKER_ID:
- kafka 브로커 아이디를 지정한다. 유니크해야하며 지금 예제는 단일 브로커는 없어도 무방하다
- KAFKA_ZOOKEEPER_CONNECT:
- kafka가 zookeeper에 커넥션하기 위한 대상을 지정한다.
- 여기서는 zookeeper(서비스이름):2181(컨테이너내부포트) 로 대상을 지정했다.
- KAFKA_ADVERTISED_LISTENERS:
- 외부에서 접속하기 위한 리스너 설정을 한다.
- KAFKA_LISTENER_SECURITY_PROTOCOL_MAP:
- 보안을 위한 프로토콜 매핑이디. 이 설정값은 KAFKA_ADVERTISED_LISTENERS 과 함께 key/value로 매핑된다.
- KAFKA_INTER_BROKER_LISTENER_NAME:
- 도커 내부에서 사용할 리스너 이름을 지정한다.
- 이전에 매핑된 PLAINTEXT가 사용되었다.
- KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR:
- single 브로커인경우에 지정하여 1로 설정했다.
- 멀티 브로커는 기본값을 사용하므로 이 설정이 필요 없다.
- KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS:
- 카프카 그룹이 초기 리밸런싱할때 컨슈머들이 컨슈머 그룹에 조인할때 대기 시간이다.
CMAK ( Kafka Manager )
Kafka Manager는 yahoo에서 제작한 GUI 기반 카프카 관리 도구로, 웹 환경에서 클러스터, 토픽 등의 생성 및 변경, consumer group 확인 등의 작업을 웹 환경에서 확인하고 진행할 수 있다. 사실 CLI 환경에서도 Kafka를 관리할 수 있으나 편의적인 측면에서 많은 기업들이 kafka-manager 를 도입하여 운용중이다.
💡 주요기능
a) Kafka Cluster 관리(모니터링)
b) Consumer Lag 관리(모니터링)
c) 파티션 Rebalance: 파티션 추가
d) 토픽 관리: 리스트 조회, 생성&삭제
+Details: https://github.com/yahoo/CMAK#deployment
GitHub - yahoo/CMAK: CMAK is a tool for managing Apache Kafka clusters
CMAK is a tool for managing Apache Kafka clusters. Contribute to yahoo/CMAK development by creating an account on GitHub.
github.com
docker-compose up -d

'개-발 > Infra' 카테고리의 다른 글
[NCP] Ncp kafka VM 생성 (0) | 2023.06.12 |
---|---|
[Kafka] 카프카 Console 명령어 (0) | 2023.06.08 |
[Kafka] Kafka 란 ? (0) | 2023.06.07 |
[Kafka] Zookeeper 란? (1) | 2023.06.07 |
[Elastic] 한글형태소 분석기 (nori 설치) (2) | 2023.06.03 |