docker 기반의 카프카 실습 환경을 만들어보려고 한다.
개인적으로 실습할 경우 클라우스 컴퓨팅 서비스를 사용하지 않는 이상 개인 PC 에서 컴퓨터 리소스가 매우 부족하기 때문에 Docker 를 사용해서 카프카를 간단하게 사용할 수 있는 실습 환경을 만들어보려고 한다.
준비사항
먼저 준비사항으로는 Docker 가 설치되어있어야 한다. 그리고 docker compose 2 버전 이상이 설치가 되어있어야 한다.
나는 다음과 같은 버전으로 docker 와 docker compose 가 설치되어있다.
# docker version
$ docker -v
Docker version 27.4.0, build bde2b89
# docker compose version
$ docker compose version
Docker Compose version v2.31.0-desktop.2
docker-compose.yaml 파일 작성
다음으로 도커 컨테이너를 실행하기 위한 docker-compose.yaml 파일을 만들어주어야 한다.
컨테이너는 주키퍼 애플리케이션과 카프카 애플리케이션을 실행하기 위한 2개의 컨테이너를 생성해주어야 하고 컨테이너를 생성할 이미지를 가져와서 사용해야 한다.
나는 confluence 에서 제공해주는 이미지를 사용하기 위해서 아래의 이미지를 참고해서 만들었다.
https://hub.docker.com/r/confluentinc/cp-kafka
hub.docker.com
구성 방법은 아래의 문서를 확인할 수 있다.
Docker Image Configuration Reference for Confluent Platform | Confluent Documentation
This topic describes how to configure the Docker images when starting Confluent Platform. You can dynamically specify configuration values in the Confluent Platform Docker images with environment variables. You can use the Docker -e or --env flags to speci
docs.confluent.io
참고로, 나는 m1 맥북을 사용하고 있는데 다행히고 arm64 와 amd64 모두 지원해주는 것 같다.
그리고 주키퍼는 아래의 이미지를 사용하려고 한다.
https://hub.docker.com/r/confluentinc/cp-zookeeper
hub.docker.com
주키퍼 구성 방법은 아래의 문서를 참고했다.
Docker Image Configuration Reference for Confluent Platform | Confluent Documentation
This topic describes how to configure the Docker images when starting Confluent Platform. You can dynamically specify configuration values in the Confluent Platform Docker images with environment variables. You can use the Docker -e or --env flags to speci
docs.confluent.io
이미지와 문서를 참고해서 만든 docker-compose.yaml 파일은 아래와 같다.
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_SERVER_ID: 1
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
ports:
- "2181:2181"
kafka:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://localhost:9092'
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
주키퍼와 카프카 애플리케이션의 환경변수들은 다음과 같이 정리할 수 있다.
주키퍼 환경 설정
- ZOOKEEPER_SERVER_ID : 주키퍼 고유 아이디. 여러 노드가 있을 경우 고유 식별자로 사용된다.
- ZOOKEEPER_CLIENT_PORT: 카프카가 주키퍼와 통신하기 위한 포트
- ZOOKEEPER_TICK_TIME : 주키퍼의 기본 시간 단위, 세션 및 동기화 간격을 설정
- ZOOKEEPER_INIT_LIMIT : 주키퍼의 초기화 제한 시간
- ZOOKEEPER_SYNC_LIMIT : 주키퍼의 동기화 제한 시간
카프카 환경 설정
- KAFKA_BROKER_ID : 카프카 고유 아이디. 멀티 노드의 경우 고유 식별자로 사용된다.
- KAFKA_ZOOKEEPER_CONNECT : 카프카가 주키퍼에 연결하기 위한 서버를 지정한다. 주키퍼 컨테이너를 지정해주면 된다.
- KAFKA_LISTENER_SECURITY_PROTOCOL_MAP : 보안 프로토콜을 매핑하는 값이다. PLAINTEXT 만 사용한다.
- KAFKA_ADVERTISED_LISTENERS : 주키퍼 모드에서 필요하다. 클라이언트에서 접속할 수 있도록 설정한다.
- KAFKA_INTER_BROKER_LISTENER_NAME : 내부에서 사용할 브로커의 리스너 이름을 정한다.
- KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR : 단일 노드인 경우 1로 설정한다. 노드가 3개 이상이면 기본 값이 적용된다.
- KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS : 컨슈머 그룹 리밸런싱 지연 시간 설정
환경 설정을 알아봤는데 문서에 설명이 되어있지만 직접 사용해보지 않아서 그런가 아직까지는 설정 내용이 와닿지 않는 것 같다.
카프카 실행하기
이제 docker compse 를 통해 컨테이너를 실행해보자.
$ docker compose up -d
실행하게 되면 열심히 이미지를 pull 하고 가져온 이미지를 통해 컨테이너를 실행하게 된다.
docker compose up -d
[+] Running 12/18
⠴ kafka [⣤⠀] Pulling 97.6s
⠦ 4584ba2d9098 Downloading [==========================> ] 66.38MB/126.6MB 91.7s
⠦ d83cb91aa196 Waiting 91.7s
⠴ zookeeper [⣿⣿⡀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣄⣿] 215.2MB / 583.1MB Pulling 97.6s
✔ 250be2ed7966 Pull complete 47.7s
✔ 403fc857f6c0 Pull complete 47.7s
⠦ 51621d216640 Downloading [==========> ] 74.92MB/369MB 91.7s
✔ cab3ae4023c6 Download complete 2.4s
✔ 61d89b2c0cc6 Download complete 7.8s
✔ f979a52c62cf Download complete 8.8s
✔ 32ed20b0e10c Download complete 38.6s
✔ 5a2fb15befbe Download complete 40.3s
✔ e179beed3c94 Download complete 41.3s
✔ 2fb153692d8a Download complete 42.4s
✔ 3c1400d492d2 Download complete 43.2s
✔ 1907e1ffcccd Download complete 44.7s
⠦ 96dee739f744 Downloading [=====================> ] 53.34MB/126.6MB 91.7s
✔ 98b68b11b51d Download complete 48.0s
자 이제 컨테이너 실행이 완료되면 실행중인 카프카와 주키퍼 컨테이너를 확인할 수 있다.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
62e9cbe98669 confluentinc/cp-kafka:latest "/etc/confluent/dock…" 4 seconds ago Up 3 seconds 0.0.0.0:9092->9092/tcp kafka-kafka-1
62722d4af9b9 confluentinc/cp-zookeeper:latest "/etc/confluent/dock…" 5 seconds ago Up 3 seconds 2888/tcp, 0.0.0.0:2181->2181/tcp, 3888/tcp kafka-zookeeper-1
간단한 카프카 실습해보기
이제 간단한 카프카 실습을 해보려고 한다. 어떻게 하는지 몰라 간단한 카프카 테스트용 코드들을 가져와봤다.
명령어는 카프카 컨테이너에 접속해서 진행했다.
토픽 생성하기
kafka-topics --create --topic topic-test --bootstrap-server kafka:9092 --replication-factor 1 --partitions 1
kafka-topics 라는 명령어를 통해서 topic-test 를 만들고 실행할 서버는 kafka:9092 서버로 지정하고 복제본은 단일 노드에서 실행했기 때문에 1개로 정하고 파티션도 마찬가지로 1개로 정해서 토픽을 생성해준다.
생성한 토픽 리스트를 확인해본다.
$ kafka-topics --list --bootstrap-server kafka:9092
topic-test
조금 더 자세히 확인하고 싶다면 describe 옵션을 사용해보자.
$ kafka-topics --describe --topic topic-test --bootstrap-server kafka:9092
Topic: topic-test TopicId: 2rcPoW_NSrqTI-NguNC6Hg PartitionCount: 1 ReplicationFactor: 1 Configs:
Topic: topic-test Partition: 0 Leader: 1 Replicas: 1 Isr: 1 Elr: N/A LastKnownElr: N/A
토픽을 삭제하고 싶다면 아래와 같이 실행하면 된다.
kafka-topics --delete --topic topic-test --bootstrap-server kafka:9092
컨슈머 실행하기
이제 메시지를 받을 컨슈머 부터 실행해보자.
kafka-console-consumer --topic topic-test --bootstrap-server kafka:9092
아무런 결과는 나오지 않고 실행된 채로 있는 것을 확인할 수 있다.
프로듀서 실행하기
그럼 이제 프로듀서를 실행해서 토픽을 전달해보자.
$ kafka-console-producer --topic topic-test --broker-list kafka:9092
>
프로듀서를 실행하게 되니 > 표시와 함께 입력하는 창으로 변하게 된다. 토픽으로 아까 생성한 topic-test 와 연결되어있어 메시지를 작성하면 프로듀서가 컨슈머로 메시지를 전달하게 된다.
메시지 전달하기
이제 값을 입력하면 프로듀서가 메시지를 받아서 카프카를 통해 컨슈머로 전달되는 것을 확인할 수 있다.
아래의 사진처럼 프로듀서에 입력하자마자 바로 컨슈머에 출력되는 것을 확인할 수 있었다.
여기까지 카프카를 실습하기 위한 환경을 만들어보았다. 아무래도 단일 노드만 사용하기 때문에 멀티 노드에서 사용되는 기능들이나 여러 실습을 하기는 어려울수도 있지만 정말 간단한 테스트나 실습 정도는 쉽게 할 수 있을 것 같다. 지금 당장에는 카프카와 친해지는 것부터!