728x170
해당 글에서는 Docker Compose를 통해서 Apache Kafka(KRaft), Kafka-ui 구성하는 방법에 대해 알아봅니다
💡 [참고] 이전에 작성한 Docker 관련 글들을 읽으시면 도움이 됩니다.
분류 | 설명 | 링크 |
이해하기 | Docker 환경 설치 및 실행 방법 | https://adjh54.tistory.com/350 |
이해하기 | Docker 기초 이론(아키텍처, 흐름, 주요 용어) | https://adjh54.tistory.com/352 |
이해하기 | Docker 컨테이너 라이프 사이클 & CLI | https://adjh54.tistory.com/359 |
이해하기 | DockerFile 이론 + Nginx 환경 구성 및 배포 방법 | https://adjh54.tistory.com/414 |
이해하기 | Docker Compose 이해하고 구성 | https://adjh54.tistory.com/503 |
이해하기 | Apache Kafka 이해하기 -1 : 주요 모델 및 구성요소 | https://adjh54.tistory.com/636 |
환경구성 | DockerFile + Vault 환경 구성 및 배포 방법 | https://adjh54.tistory.com/415 |
환경구성 | DockerFile + React 환경 구성 및 배포 방법 | https://adjh54.tistory.com/417 |
환경구성 | DockerFile + Spring Boot 환경 구성 및 배포 방법 | https://adjh54.tistory.com/420 |
환경구성 | DockerFile + Redis 환경 구성 및 배포 방법 | https://adjh54.tistory.com/449 |
환경구성 | DockerFile + RabbitMQ 환경 구성 및 실행 방법 | https://adjh54.tistory.com/496 |
환경구성 | Docker Compose + RabbitMQ 노드 클러스터링 방법 | https://adjh54.tistory.com/517 |
환경 구성 | Docker Compose + Apache Kafka, Kafka-UI 환경 구성 방법 | https://adjh54.tistory.com/637 |
1) Apache Kafka
💡 Apache Kafka
- 실시간으로 스트림 데이터를 수집하고 처리하는 데 최적화된 ‘분산 이벤트 스트리밍 플랫폼(Distributed Data Streaming Platform)’입니다. 이는 실시간으로 발생하는 대량의 데이터를 중앙 허브를 통해 흐르도록 설계되어 있습니다. 이를 통해 데이터의 일관성을 유지하고 시스템 전반의 복잡성을 줄일 수 있습니다.
- 이러한 다량의 데이터는 A 지점에서 B 지점까지 만의 데이터가 이동되는 것뿐만 아니라, A 지점에서 Z지점까지의 필요한 모든 곳에 대규모 데이터를 동시에 전달할 수 있습니다.
- 현대적인 데이터 파이프라인 구축에 필수적인 도구로 자리 잡았으며, Netflix, LinkedIn, Uber 등 많은 기업들이 핵심 인프라로 사용하고 있습니다.
[ 더 알아보기 ]
💡 Kafka에 의해 처리되는 스트림(Stream)과 스트리밍(Streaming)은 무엇일까?
- 스트림(Stream)이란 시간에 따라 연속적으로 발생하는 데이터의 흐름을 의미합니다. 예를 들어, 실시간 주식 거래 데이터, SNS 피드, IoT 센서 데이터 등이 스트림의 예시입니다.
- 스트리밍(Streaming)**은 이러한 데이터 스트림을 실시간으로 처리하는 과정을 말합니다
💡 분산 이벤트 스트리밍 플랫폼(Distributed Event Streaming Platform)이란?
- 여러 서버에 걸쳐 이벤트 데이터를 실시간으로 처리하고 저장하는 시스템을 의미합니다. 주요한 특징은 분산 처리를 실시간으로 처리하며, 데이터 복제를 통해 장애 상황에서도 데이터 손실을 방지하며, 이벤트 발생 순서대로 처리하여 데이터의 일관성을 보장합니다.
2) Docker Compose
💡 Docker Compose
- 여러 컨테이너가 함께 실행되는 환경에서, 하나의 파일 내에 정의하여 여러 컨테이너를 관리하기 위한 도구를 의미합니다. 즉, 여러 컨테이너를 관리할 때, 단일 명령어를 통해 생성-관리-배포하는 기능을 수행하는 역할을 합니다.
- 기존의 Dockerfile을 통해 단일 컨테이너를 ‘생성-관리-배포’하는 과정에서의 처리과정은 간단하였으나 여러 컨테이너를 일괄 띄우는데 시간 소요가 많이 되기에 이를 사용합니다.
- 이러한 컨테이너 관리는 YAML 파일 형식을 사용하여 서비스, 네트워크 및 볼륨 같은 애플리케이션 서비스를 구성할 수 있습니다. 또한 개발, 테스트, 스테이징, 운영 및 CI 워크플로우 환경에서 애플리케이션을 이동하여 배포가 가능하기에 관리가 매우 편리합니다.
1. Docker Compose 처리 과정
💡 Docker Compose 처리 과정
1. Dockerfile에 필요한 모든 서비스를 정의합니다 (Define all your required services in a Dockerfile)
- Dockerfile 내에 각 다운로드할 이미지와 실행할 컨테이너에 대한 정의를 구성합니다.
2. Compose 파일(YAML/YML) 내에 각 서비스 간의 관계를 정의합니다(Define the releationship between each service in a Compose file)
- 이 파일에는 실행할 서비스(컨테이너)들과 그 설정들을 포함하고 있습니다. 사용할 파일 내용은 Docker 이미지, 포트 매핑, 볼륨 마운트, 네트워크 설정, 환경 변수 등이 정의됩니다.
3. Docker Compose를 사용하여 애플리케이션을 시작합니다(Use Docker Compose to start the application)
- Docker Compose의 실행 명령어 ‘docker-compose up’ 명령어를 수행하여 서비스를 실행합니다.
- 이 명령어를 통해서 Docker Compose 파일에 정의된 모든 서비스를 시작합니다. 필요한 Docker 이미지가 로컬에 없으면 자동으로 다운로드하고, 컨테이너를 생성하고 시작합니다.
+ Docker Compose의 서비스 상태를 확인합니다.
- Docker Compose의 상태 확인 명령어 ‘docker-compose ps’ 명령어를 수행하여 서비스의 상태를 확인합니다.
- 현재 실행 중인 서비스의 상태를 확인할 수 있습니다.
+ 필요에 따라 Docker Compose의 서비스를 중지합니다.
- Docker Compose의 중지 명령어 ‘docker-compose stop’ 명령어를 수행하거나 ‘docker-compose down’ 명령어를 수행하여 모든 서비스를 중지하고 컨테이너, 네트워크, 볼륨을 삭제합니다.
3) Apache Kafka Docker Compose 환경 구성 : KRaft(Kafka Raft) 활용
💡 Apache Kafka Docker Compose 환경 구성 : KRaft(Kafka Raft) 활용
- Apache Kafka 중 Zookeeper가 아닌 KRaft를 Docker Compose를 이용하여서 구성하는 방법에 대해 알아봅니다.
1. Docker Compose 상위 요소 확인
💡 Docker Compose 상위 요소 확인
- services 하위에 kafka, kafka-ui를 구성하였습니다.
services:
kafka:
image: confluentinc/cp-kafka:latest
ports:
- "29092:29092"
environment:
kafka-ui:
image: provectuslabs/kafka-ui:latest
ports:
- "8080:8080"
environment:
depends_on:
- kafka
분류 | 상세 분류 | 설명 |
service.kafka | image | Confluent의 confluentinc/cp-kafka를 이용하였습니다. |
ports | 컨테이너와 호스트 시스템 간의 포트 매핑을 설정하는 부분입니다. | |
environment | Kafka 설정을 위한 환경변수들이 정의되는 부분입니다. | |
service.kafka-ui | image | provectuslabs/kafka-ui를 이용하여 Kafka의 UI를 이용하였습니다. |
ports | UI 접속을 위한 포트 매핑을 설정하는 부분입니다. (* 해당 부분에서는 8080 포트 구성하였습니다) | |
environment | Kafka UI 설정을 위한 환경변수들이 정의되는 부분입니다. | |
depends_on | kafka 서비스가 먼저 시작된 후에 UI가 시작되도록 의존성을 설정합니다. |
1.1. kafka 이미지 종류
💡 kafka 이미지 종류
- Apache Kafka Docker 이미지는 여러 제공업체에서 제공하고 있으며, 각각의 이미지는 서로 다른 특징과 장점을 가지고 있습니다.
이미지 명 | 설명 | docker hub 링크 |
confluentinc/cp-kafka | Kafka를 만든 개발자들이 설립한 Confluent에서 제공. 가장 널리 사용되며 안정적으로 평가받음 | https://hub.docker.com/r/confluentinc/cp-kafka |
bitnami/kafka | Bitnami에서 제공하는 이미지. 보안 및 최적화가 잘 되어있음 | https://hub.docker.com/r/bitnami/kafka |
wurstmeister/kafka | 오랫동안 커뮤니티에서 사용되어 왔으나, 현재는 적극적으로 유지보수되지 않음 | https://hub.docker.com/r/wurstmeister/kafka |
apache/kafka | Apache Software Foundation에서 제공하는 공식 이미지 | https://hub.docker.com/r/apache/kafka |
1.2. kafka-ui 이미지 종류
💡 kafka-ui 이미지 종류
- Apache Kafka의 관리와 모니터링을 위한 다양한 Web UI 도구들이 있으며, Docker 이미지로 제공됩니다.
- 각 도구는 서로 다른 특징과 기능을 가지고 있어 사용 목적에 따라 선택할 수 있습니다.
이미지 명 | 설명 | 주요 특징 | docker hub 링크 |
provectuslabs/kafka-ui | 현대적이고 직관적인 Web UI | 토픽 관리, 모니터링, ACL 관리, Schema Registry 지원 | https://hub.docker.com/r/provectuslabs/kafka-ui |
obsidiandynamics/kafdrop | 간단하고 가벼운 Web UI | 기본적인 모니터링 (토픽, 파티션, 컨슈머 그룹) | https://hub.docker.com/r/obsidiandynamics/kafdrop |
tchiotludo/akhq | 고급 기능 제공 GUI | 상세 모니터링, 관리 기능, REST API 지원 | https://hub.docker.com/r/tchiotludo/akhq |
2. Docker Compose 환경 파일 확인
💡 Docker Compose 환경 파일 확인
- Docker Compose 환경 파일에는 Kafka와 Kafka UI 서비스를 위한 다양한 환경 변수들이 정의되어 있습니다.
서비스 분류 | 분류 | 값 | 설명 |
service.kafka.environment | KAFKA_NODE_ID | 1 | Kafka 노드의 고유 식별자 |
KAFKA_PROCESS_ROLES | broker,controller | 브로커와 컨트롤러 역할 지정 | |
KAFKA_CONTROLLER_QUORUM_VOTERS | 1@kafka:29093 | KRaft 컨트롤러 투표자 설정 | |
KAFKA_LISTENERS | 'PLAINTEXT://kafka:9092,CONTROLLER://kafka:29093,PLAINTEXT_HOST://0.0.0.0:29092' | Kafka가 수신할 주소와 포트 설정 | |
KAFKA_ADVERTISED_LISTENERS | 'PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092' | 클라이언트에게 공개할 리스너 주소 | |
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP | 'CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT' | 리스너별 보안 프로토콜 매핑 | |
KAFKA_CONTROLLER_LISTENER_NAMES | 'CONTROLLER' | 컨트롤러 리스너 이름 | |
KAFKA_INTER_BROKER_LISTENER_NAME | 'PLAINTEXT' | 브로커 간 통신용 리스너 이름 | |
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR | 1 | 오프셋 토픽 복제 팩터 | |
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR | 1 | 트랜잭션 상태 로그 복제 팩터 | |
CLUSTER_ID | 'ciWo7IWazngRchmPES6q5A==' | 클러스터의 고유 식별자 | |
KAFKA_LOG_DIRS | '/tmp/kraft-combined-logs' | 로그 저장 디렉토리 경로 | |
service.kafka-ui.environment | KAFKA_CLUSTERS_0_NAME | local | Kafka 클러스터 이름 |
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS | kafka:9092 | Kafka 부트스트랩 서버 주소 |
services:
kafka:
image: confluentinc/cp-kafka:latest
ports:
- "29092:29092"
environment:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: 'broker,controller'
KAFKA_CONTROLLER_QUORUM_VOTERS: '1@kafka:29093'
KAFKA_LISTENERS: 'PLAINTEXT://kafka:9092,CONTROLLER://kafka:29093,PLAINTEXT_HOST://0.0.0.0:29092'
KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092'
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 'CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT'
KAFKA_CONTROLLER_LISTENER_NAMES: 'CONTROLLER'
KAFKA_INTER_BROKER_LISTENER_NAME: 'PLAINTEXT'
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
CLUSTER_ID: 'ciWo7IWazngRchmPES6q5A=='
KAFKA_LOG_DIRS: '/tmp/kraft-combined-logs'
kafka-ui:
image: provectuslabs/kafka-ui:latest
ports:
- "8080:8080"
environment:
KAFKA_CLUSTERS_0_NAME: local
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092
depends_on:
- kafka
💡 [참고] confluentinc/cp-kafka:latest의 속성에 대해 궁금하시면 아래의 글을 참고하시면 도움이 됩니다.
4) Apache Kafka + kafka-ui 실행하기
💡 Apache Kafka + kafka-ui 실행하기
- 구성한 docker-compose.yml 파일을 기반으로 이미지를 생성하고 컨테이너를 실행합니다.
1. Docker Compose 실행
💡 Docker Compose 실행
- docker-compose 명령어를 통해서 기본값인 ‘docker-compose.yml’ 파일을 찾아서 ‘-d’ 명령어를 통해 백그라운드에서 컨테이너를 실행합니다.
💡 지정한 명령어를 기준으로 실행 시 동작 과정
1. Docker Compose 파일을 읽고 필요한 이미지를 다운로드
2. 정의된 서비스들의 컨테이너를 생성
3. 서비스 간의 네트워크 구성
4. 볼륨 마운트 설정
5. 환경 변수 적용
6. 정의된 순서대로 컨테이너 시작
명령어 | 설명 |
docker-compose | Docker Compose 도구를 실행하기 위한 기본 명령어 |
up | Docker Compose 파일에 정의된 모든 서비스를 시작하는 명령어 |
-d | detached mode의 약자로, 백그라운드에서 컨테이너를 실행하여 터미널을 계속 사용할 수 있게 하는 옵션 |
# 프로젝트 접근
$ cd simple-apache-kafka
# docker compose 실행
$ docker-compose up -d
💡 Docker Desktop을 통해서 이미지가 생성되고 컨테이너 실행 됨을 확인하였습니다
2. Docker Compose 상태 확인
💡 Docker Compose 상태 확인
- docker-compose 명령어를 통해서 기본값인 ‘docker-compose.yml’ 파일을 찾아서 ‘ps’ 명령어를 통해 실행 중인 Docker Compose 서비스들의 상태를 확인합니다.
# docker compose 상태 확인
$ docker-compose ps
명령어 | 설명 |
docker-compose | Docker Compose 도구를 실행하기 위한 기본 명령어 |
ps | 현재 실행 중인 Docker Compose 서비스들의 상태를 확인하는 명령어 |
3. Kafka UI 접속 확인
💡 Kafka UI 접속 확인
- 위에서 구성한 Docker Compose의 서비스로 Kafka UI를 확인할 수 있습니다
5) Apache Kafka 동작 확인
1. Kafka 컨테이너 접속
💡 Kafka 컨테이너 접속
- Kafka CLI 도구를 사용하여서 Kafka 컨테이너에 접속합니다.
명령어 | 설명 |
docker exec -it | 실행 중인 Docker 컨테이너에 대화형 터미널로 접속하는 명령어 |
simple-apache-kafka-kafka-1 | 접속할 Kafka 컨테이너의 이름 |
bash | 컨테이너 내에서 실행할 셸(shell) 프로그램 |
# Kafka 컨테이너에 접속
$ docker exec -it simple-apache-kafka-kafka-1 bash
2. Kafka 컨테이너 내의 토픽 생성
💡 Kafka 컨테이너 내의 토픽 생성
- Kafka 컨테이너 내에서 토픽을 생성하기 위해서는 kafka-topics 명령어를 사용합니다.
- 이 명령어를 통해 새로운 토픽을 생성하고, 파티션 수와 복제 팩터를 설정할 수 있습니다.
- 토픽은 Kafka에서 메시지를 구성하는 가장 기본적인 단위이며, 생산자(Producer)가 메시지를 발행하고 소비자(Consumer)가 구독하는 대상이 됩니다.
명령어 | 설명 |
kafka-topics | Kafka 토픽을 관리하는 CLI 도구 |
--create | 새로운 토픽을 생성하는 옵션 |
--topic test-topic | 생성할 토픽의 이름을 'test-topic'으로 지정 |
--bootstrap-server localhost:9092 | Kafka 브로커의 주소와 포트 |
--partitions 1 | 토픽의 파티션 수를 1개로 지정 |
--replication-factor 1 | 복제 팩터를 1로 설정 (데이터 복제본 수) |
# 토픽 생성
$ kafka-topics --create --topic test-topic --bootstrap-server kafka:9092 --partitions 1 --replication-factor 1
💡 Kafka-UI
- Kafka-UI에서 Topic이 생성됨을 확인하였습니다.
3. Kafka 생산자 실행
💡 Kafka 생산자 실행
- Kafka 생산자(Producer)를 실행하여 토픽에 메시지를 전송할 수 있습니다.
- 아래 명령어를 통해 콘솔 기반의 생산자를 실행하고 메시지를 입력할 수 있습니다.
명령어 | 부분 설명 |
kafka-console-producer | Kafka의 콘솔 기반 생산자(Producer)를 실행하는 기본 명령어 |
--topic test-topic | 메시지를 전송할 대상 토픽의 이름을 'test-topic'으로 지정 |
--bootstrap-server kafka:9092 | Kafka 브로커의 호스트명(kafka)과 포트(9092)를 지정 |
# 생산자 실행
$ kafka-console-producer --topic test-topic --bootstrap-server kafka:9092
💡 아래와 같이 생산자를 실행하여 토픽 내에 “hello”라는 메시지를 입력하고 생성하였습니다.
4. Kafka 소비자 실행
💡 Kafka 소비자 실행
- 새로운 터미널 창을 열어 Kafka 컨테이너에 접속한 후, 소비자를 실행하여 이전에 생산자가 보낸 메시지들을 확인할 수 있습니다.
# Kafka 컨테이너에 접속
$ docker exec -it simple-apache-kafka-kafka-1 bash
# 소비자 실행
$ kafka-console-consumer --topic test-topic --bootstrap-server kafka:9092 --from-beginning
명령어 | 설명 |
kafka-console-consumer | Kafka의 콘솔 기반 소비자(Consumer)를 실행하는 명령어 |
--topic test-topic | 구독할 토픽의 이름을 지정 |
--bootstrap-server kafka:9092 | Kafka 브로커의 주소와 포트 |
--from-beginning | 토픽의 처음부터 모든 메시지를 읽어오는 옵션 |
💡 아래와 같이 소비자(Consumer)를 구성한 test-topic에 접속했을때 생성자가 만든 메시지를 받을 수 있습니다.
💡 아래와 같이 생성자가 다시한번 메시지를 생성하면, 소비자에서 해당 메시지를 받아옴을 확인하였습니다.
5. 토픽 목록 확인하기
💡 토픽 목록 확인하기
- 현재 존재하는 모든 토픽의 목록을 확인할 수 있습니다.
명령어 | 설명 |
kafka-topics | Kafka 토픽을 관리하는 CLI 도구 |
--list | 모든 토픽의 목록을 보여주는 옵션 |
--bootstrap-server kafka:9092 | Kafka 브로커의 주소(kafka)와 포트(9092)를 지정 |
오늘도 감사합니다 😀
그리드형
'Docker > 환경설정 및 구성' 카테고리의 다른 글
[Docker] Docker Compose를 이용한 Keycloak 환경 구성 및 실행 방법 (1) | 2025.01.18 |
---|---|
[Docker] Docker Compose를 이용한 Jenkins 환경 구성 및 실행방법 (0) | 2025.01.17 |
[Docker] Docker Compose를 이용한 RabbitMQ 노드 클러스터링 구성하기 (0) | 2024.06.28 |
[Docker] Dockerfile을 이용한 RabbitMQ 환경 구성 및 실행방법 (0) | 2024.05.28 |
[Docker] Dockerfile을 이용한 Redis 환경 구성 및 실행방법 (0) | 2024.03.16 |