본문 바로가기

DataEngineering/Kafka

[Kafka] docker-compose 에서 Kafka 실행하기 | 프로삽질러

우분투 가상환경에서 일일이 zookeeper, kafka 를 설치하여 개발 진행 중에 도커 사용의 필요성을 느껴 도커에서 카프카 서버를 실행하기로 했습니다. 맥을 사용하면 docker 설치와 동시에 docker-compose 가 함께 설치되기 때문에 zookeeper 실행이 필수인 kafka 를 실행하기 훨씬 수월합니다. (우분투로 설치하고 실행하기까지 일주일이 걸렸다면 도커 사용은 1시간도 안돼서 설치 후 개발까지 하고 있다는 점 ㅜㅜ 훨씬 편합니다 ㅜㅜ )

 

실행 환경 

- mac os 

- docker-compose (zookeeper, kafka 컨테이너 설치 완료)

- 클라이언트 실행 위해 kafka 컨테이너와 동일한 버전 kafka 로컬에 설치

 

0. docker-compose.yml 작성

vi docker-compose.yml 로 아래 내용을 작성해 저장해주세요.  저는 개발 초기 단계라 외부 네트워크와 연결하지 않고 로컬에서 컨테이너를 실행할 예정이라 기본 설정까지만 하였습니다. docker-compose.yml 을 생성하고 저장하는 디렉토리는 원하는 디렉토리에 하시면 됩니다.

 

 

1. kafka, zookeeper docker 실행

docker compose docker-compose.yml up -d

 

작성한 docker-compose.yml 폴더 안에서 해당 명령을 실행합니다. docker compose up 명령어는 docker compose에 정의된 모든 컨테이너를 실행시키는 명령어입니다. kafka는 zookeeper 실행이 동반되는데 매번 두 컨테이너를 따로 실행하기 번거로우므로 compose 로 작성하여 한 번에 두 컨테이너가 실행되게 합니다. yml 파일명이 docker-compose.yml 이 아니라면 [ -f  작성한파일.yml ] 옵션을 추가하여 실행합니다. 백그라운드에서 도커를 실행시키고 싶다면 -d 옵션을 추가합니다. 데몬으로 실행하지 않으면 ctrl+c 혹은 해당 터미널 창을 닫는 순간 컨테이너가 중지되기 때문에 -d 옵션을 꼭 붙여 주시길 바랍니다.

 

docker compose up

docker ps -a 

이 명령어는 현재 실행 중인 모든 도커 컨테이너의 목록을 보여주는 명령어입니다. 저같은 경우 zookeeper, kafka 컨테이너가 실행 중이라고 생각해 kafka 클라이언트를 실행했는데 연결이 되지않는다는 오류를 보고 두 컨테이너가 실행 중인지 확인을 위해 사용했습니다. 다행이(?) 컨테이너들이 실행되지 않아 발생한 오류였습니다. 도커 실행 시 -d 데몬 옵션을 주지않고 실행 후 해당 터미널을 닫았기때문에 컨테이너들이 중지된 것입니다 ㅜㅜ 

 

docker ps -a

2. 로컬에 설치된 kafka 클라이언트 실행 

 zookeeper, kafka 컨테이너로  kafka 서버를 실행시켰다면, kafka 클라이언트를 통해 kafka 가 잘 동작하는지 확인하여야합니다. 콘솔에서 producer, consumer 를 띄워 확인해보겠습니다. 

 

1) topic 생성

bin/kafka-topics.sh --create --zookeeper 127.0.0.1:2181 --replication-factor 1 --partitions 1 --topic test

로컬에 설치한 kafka 폴더에서 test 라는 topic 를 생성했습니다. 이때 replication-facotor, partions 옵션은 지정하고 싶은 개수 만큼, zookeeper 옵션에 대한 ip주소, port 번호는 docker-compose.yml 에 작성한 대로 지정하면 됩니다. 

 

"test" topic 생성

2) consumer 실행

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

topic test 의 데이터를 구독하는 consumer 를 생성하였습니다. bootstrap-server 는 앞서 yml 파일에 작성한 kafka server 주소, port 번호로 작성하시길 바랍니다. consumer process 는 백그라운드에서 주기적으로 offset을 커밋하기 때문에 ctrl+c 를 누르지 않는다면 계속 실행 중에 있습니다. 만약 test topic 에 현재 어떤 데이터도 없다면 빈 화면으로 대기하고 있습니다.

3) producer 실행

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

새 터미널을 키고 topic test 에 데이터를 발행하는 producer를 실행하겠습니다. yml 파일에서 지정한 broker(kafka server)의 주소, port 번호로 실행해야 정상작동합니다. 아래 producer, consumer 콘솔창을 보면 producer 가 쓴 데이터를 consumer 가 가져온 것을 확인할 수 있습니다. producer process 를 종료해도 consumer 는 자신의 process 에 ctrl+c 를 하지 않는 이상 백그라운드에서 대기하기 때문에 consumer process 도 종료해주시기 바랍니다. 

 

kafka producer
kafka consumer

 

이렇게 도커로 kafka를 설치하고, 로컬에서 kafka 클라이언트들이 정상 작동되는 것을 확인하였습니다. 

다들 즐거운 개발하세요 :)