docker를 이용해 kafka 환경 구축하기
kafka 실습 환경을 구축하면서 docker을 이용하기로 결정했습니다.
이유라 함은 처음 사용해보는 kafka이기에 설치 중 어떠한 오류가 발생할 지 모르기 때문이며, 역시나 여러 오류를 접하면서 docker을 이용하길 잘했다는 생각을 했습니다.
zookeeper, kafka image pull
제 클라우드는 arm ubuntu 22.04버전을 사용하고 있습니다.
때문에 zookeeper docker image는 흔히 사용중인 wurstmeister/zookeeper
를 이용하지 않았고, 각자 환경에 맞추어 이미지를 받으시면 될 것 같습니다.
docker pull arm64v8/zookeeper
docker pull wurstmeister/kafka
docker-compose.yml 작성
저는 빠른 설치를 위해 docker-compose를 이용해 run하였습니다.
version: '3'
services:
zookeeper:
image: arm64v8/zookeeper
container_name: zookeeper
ports:
- "9007:2181"
networks:
kafkaNetwork:
ipv4_address: 10.10.20.141
kafka:
image: wurstmeister/kafka
container_name: kafka
depends_on:
- zookeeper
ports:
- "9008:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 10.10.20.142
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://[ip:port]
networks:
kafkaNetwork:
ipv4_address: 10.10.20.142
networks:
kafkaNetwork:
external: true
위 docker-compose.yml에서 확인해야 하는 점이 두가지 있는데요.
network와 KAFKA_ADVERTISED_LISTENERS 옵션입니다.
network의 경우 zookeeper와 kafka를 동일한 네트워크 환경에서 구성할 수 있도록 kafkaNetwork
라는 이름으로 네트워크를 생성했습니다.
docker network create -d bridge --subnet 10.10.20.0/24 --gateway 10.10.20.1 kafkaNetwork
이는 필수가 아니니 원하지 않을 경우 생략하셔도 좋습니다.
그리고 KAFKA_ADVERTISED_LISTENERS
옵션을 따로 주었는데요.
이 KAFKA_ADVERTISED_LISTENERS
는 외부에서 접속하는 ip와 port를 입력합니다.
이 옵션을 사용하는 이유는 kafka의 네트워크가 테스트하는 환경의 네트워크와 다르기 때문인데요.
저는 따로 만들어 둔 클라우드를 사용했기 때문에 외부 프로젝트에서 연결할 때 사용하는 ip와 port를 입력하여 외부접근을 허용한다는 개념으로 사용했습니다.
이 또한 필수가 아니며, 로컬 컴퓨터의 docker를 이용해 kafka를 띄우는 경우 localhost로도 접근이 가능합니다.
실행하기
docker-compose up -d
이제 작성한 docker-compose.yml을 이용해 실행합니다.
그리고, kafka가 잘 실행되었는지 확인하기 위해 직접 접근해봅니다.
docker exec -it kafka /bin/bash
cd /opt/kafka/bin
/opt/kafka/bin
디렉토리는 kafka를 콘솔에서 조작할 수 있는 여러 스크립트가 존재합니다.
위와 같은 여러 쉘 스크립트 파일을 이용해 현재 카프카에 존재하는 토픽을 조회하거나, 데이터를 넣는 작업을 수행할 수 있습니다.
kafka의 여러 콘솔 명령어는 여기서 확인할 수 있습니다.
마침
이렇게 kafka를 docker 환경으로 구축하는 방법을 알아보았습니다.
여러가지 많은 방법이 있지만 도커를 이용하는 방법이 가장 쉽고 빠른 방법이라 생각했습니다.
그리고 저는 KAFKA_ADVERTISED_LISTENERS
를 이용하지 않는 바람에 콘솔에서는 정상 이용이 되었지만, 스프링 프로젝트에서는 접근이 안되어 몇 시간 붙잡고 있기도 했습니다.
이 글을 읽으시는 분들은 저와 같은 문제를 만나지 않기를 바랍니다 ㅎㅎ
'Devops' 카테고리의 다른 글
[Kubernetes] 쿠버네티스 오브젝트 (Service, Volume, ConfigMap) (0) | 2022.08.30 |
---|---|
[Kubernetes] 쿠버네티스 오브젝트(Pod, ReplicaSet, Deployment) (0) | 2022.08.29 |
[Kubernetes] 쿠버네티스 간단 개념 정리 (0) | 2022.08.29 |
[Kafka] kafka의 console 명령어 (0) | 2022.08.16 |
[Kafka] kafka에 대해 알아보자 - 2 (0) | 2022.08.15 |
[Kafka] kafka에 대하여 알아보자 - 1 (0) | 2022.08.15 |