docker

docker 로 kafka 설치

wefree 2021. 12. 22. 23:43

https://github.com/wurstmeister/kafka-docker 를 이용해 kafka 를 설치한다.

https://github.com/windbird123/kafka-docker 에는 아래의 수정이 적용되어 있어 docker-compose.yml 의 volumes 항목만 수정해 바로 docker-compose 로 실행할 수 있다.

kafka-docker clone

git clone https://github.com/wurstmeister/kafka-docker.git

Dockerfile 수정

# 설치할 kafka, scala 버전을 변경해 준다.
# https://github.com/wurstmeister/kafka-docker#tags-and-releases 참고
ARG kafka_version=2.4.1
ARG scala_version=2.12

# docker-compose.yml 에서 /kafka mount 위치를 명시적으로 지정하도록 수정할 예정이므로
# VOLUME 부분을 주석 처리해 준다. 

#VOLUME ["/kafka"]

docker-compose.yml 수정

kafka 항목에 environment, volumes 를 아래와 같이 수정한다.

 kafka:
    build: .
    ports:
      # 명시적으로 9092->9092 port 를 연결
      - "9092:9092"
    environment:
      DOCKER_API_VERSION: 1.22
      # 현재 host 의 hostname(or ip)
      KAFKA_ADVERTISED_HOST_NAME: localhost
      
      # LEADER_NOT_AVAILABLE 가 발생할 경우
      # 참고: https://17billion.github.io/kafka/2017/09/01/kafka_leader_not_available.html
      KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://localhost:9092'
      
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      
      # 기타 환경 설정
      KAFKA_MESSAGE_MAX_BYTES: 10000000
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'true'
      KAFKA_DELETE_TOPIC_ENABLE: 'true'
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      
      # kafka 데이터를 저장할 위치를 명시적으로 마운트 한다.
      - /mydir/kafka/data:/kafka

docker-compose 실행

# 최신 버전 docker 가 설치되었다면
docker compose up -d

# 혹은 docker-compose 가 설치되었다면
docker-compose up -d

kafka 동작 테스트

kafka download

Dockerfile 에 정의한 kafka, scala 버전과 일치하는 kafka 를 다운로드 한다.

wget https://archive.apache.org/dist/kafka/2.4.1/kafka_2.12-2.4.1.tgz
tar xvfz kafka_2.12-2.4.1.tgz

topic 생성

test 이름으로 topic 을 생성한다.

cd kafka_2.12-2.4.1/
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 4 --topic test

consumer 실행

test topic 을 consume 하는 consumer 를 실행한다.

bin/kafka-console-consumer.sh --topic test --bootstrap-server localhost:9092 --from-beginning

producer 실행

새로운 터미널을 열어 producer 를 실행한다.

bin/kafka-console-producer.sh --topic test --broker-list localhost:9092

producer 와 consumer 연동 확인

  • producer 가 실행된 터미널 abc123 입력후 엔터
  • consumer 터미널에서 abc123 을 읽어 출력되는 것 확인

(참고) topic 삭제

bin/kafka-topics.sh --delete --zookeeper localhost:2181 --topic test