[Kafka] docker-compose를 활용한 더 쉬운 Kafka 서버 설치

반응형

지난 포스트에서 Docker를 이용해 Kafka와 Zookeeper를 설치하는 방법에 대해 알아봤습니다. 하지만 Zookeeper와 Kafka 이미지를 pull하고 run하고, 네트워크를 만드는 작업을 일일이 명령어로 치기에는 너무 불편하고 번거로운 작업들이 많았습니다.

 

그래서 이번엔 docker-compose를 이용해서 명령어 하나만 가지고 쉽게 로컬에서 Kafka 브로커를 실행하는 방법에 대해 알아보도록 하겠습니다.

 

 

 

 

docker-compose

먼저 짧게 docker-compose에 대해서 설명을 드리자면 docker-compose는 Docker의 구성 요소(이미지, 네트워크, 볼륨, 실행 전략)들을 하나의 파일로 엮어 실행하는 통합 실행 도구입니다.

 

즉 여러 개의 컨테이너를 실행시키는 도커 애플리케이션을 정의하기 위한 툴 중에 하나인데, 어떻게 동작하는지 간단히 살펴보겠습니다.

 

먼저 docker-compose.yml 파일을 작성해야 하는데, docker-compose.yml 파일에는 아래의 내용이 담겨져 있습니다.

 

  • 컨테이너 정보
  • 볼륨 정보
  • EXPOSE 포트 정보
  • 소속 네트워크 정보

 

기존 Dockerfile에서는 해당 컨테이너가 어느 Base 이미지에서 어떤 디렉터리에 어떤 파일을 복사해서 이미지로 만들 것인지를 결정하는 파일이었다면 docker-compose는 그런 Dockerfile을 읽어서 Docker Engine에서 지원하는 볼륨, 네트워크, 컨테이너 이름에 대한 정의를 파일로 한 번에 읽어서 격리된 환경으로 만들어 줍니다.

 

 

 

 

Kafka를 docker-compose로 구동하기

자 그럼 이제 docker-compose.yml 파일 한 개를 작성해서 단일 Kafka 브로커 한 개를 띄워보도록 하겠습니다.

 

위와 같이 docker-compose.yml 파일을 만든 다음.

 

$ docker-compose up -d

위 명령어를 입력합니다. 그러면 우리가 정의한 주키퍼와 카프카 두 개가 동시에 Docker Engine에서 띄우려 할 것입니다.

 

여기서 봐야할 점은 첫 번째로 만드는 도커 네트워크 부분입니다. 우리는 docker-compose.yml에서 네트워크 이름을 지정하지 않았습니다. 하지만 docker-compose는 기본적으로 멀티 컨테이너 환경일 때 네트워크 환경을 별도로 구축하고 시작합니다. 이 때 사용하는 드라이버는 Default Driver인데, Docker Engine은 기본적으로 Bridge 모드를 사용합니다.

 

그리고 컨테이너 이름은 프로젝트 폴더 이름을 Prefix로 하여 docker-compose.yml에서 정의한 이름을 Postfix로 하여 이름을 생성합니다.

 

docker ps 명령어를 입력해서 컨테이너 실행 상황을 보면 Kafka와 Zookeeper가 정상적으로 잘 실행되고 있음을 보여줍니다.

 

$ curl http://localhost:8080/commands/stats

curl 명령어를 이용해서 주키퍼와 카프카가 잘 연결되었는지도 확인해보겠습니다.

 

connections에 보다시피 한 개의 카프카가 잘 연결되었음을 볼 수 있습니다.

 

 

 

 

docker-compose로 Kafka 클러스터 구축하기

카프카는 분산 시스템입니다. 이를 위해 코디네이션 시스템으로 Zookeeper를 사용하며 우리가 수 많은 메시지 큐 중에서도 카프카를 사용하는 이유입니다.

 

하지만 분산 시스템을 만드려면 여러 대의 컴퓨터가 필요합니다. 카프카의 Leader 서버, Follower 서버, 주키퍼 등등 여러가지가 필요한데 이를 로컬에서 구축하려면 가상 머신 등을 사용해야 하지만 프로그램을 설치하고 운영체제를 설치하는 등의 시간적인 부분들이 많이 소모된다는 단점이 있습니다.

 

이 역시 docker-compose를 이용하면 빠르게 구축해 볼 수 있습니다.

 

주키퍼 1개와 카프카 3개를 띄운다고 가정했을 때 우리는 Docker 네트워크 하나를 만들고, 이 네트워크 존에 주키퍼와 카프카를 구축하고 포트를 노출하는 것입니다.

 

docker-compose에서 컨테이너 이름과 호스트 이름을 직접 지정하고 싶다면 hostname, name 키를 이용할 수 있습니다.

 

호스트 이름과 이름을 지정하면 이렇게 프로젝트 이름이 Prefix가 되지 않고, 지정한 이름으로 들어가는 걸 볼 수 있습니다.

 

여기에 보면 우리가 싱글 카프카를 구동했을 때 쓰지 않았던 KAFKA_BROKER_ID를 볼 수 있습니다. 이 ID는 특정 Producer 내지 Consumer가 카프카 클러스터에서 어느 브로커에 접근했는지를 알기 위한 식별자입니다.

 

같은 방법으로 다수의 주키퍼 클러스터와 다수의 카프카 클러스터로도 서버를 기동할 수 있습니다.

 

주키퍼 3개를 그룹핑하고, 카프카 3개를 그룹핑하여 docker-compose.yml로 작성합니다.

 

정상적으로 6개 컨테이너가 작동하는 모습을 볼 수 있습니다.

 

 

 

 

마치며..

지난 포스트에서는 Dockerfile을 이용해 좀 더 깊게 공부하며 카프카를 설치하는 과정을 다뤘다면 이제는 개념을 어느 정도 익혔으니 좀 더 쉽게 설치해서 실전에 옮기는 법을 익혔습니다.

 

개인적으로 저는 Docker가 굉장히 좋은 툴이라고 생각합니다. 이전에는 이러한 클러스터를 구축하기 위해서 Virtualbox 내지 QEMU를 설치해서 가상 환경을 하나하나 구축하거나 좀 더 머리를 쓴다면 ansible 같은 인프라 코드 플랫폼 등을 이용하는 방법도 있었을 것입니다.

 

하지만 VM 환경은 일부 비용을 지불해야하는 문제도 있고 운영체제 환경을 맞추는 등의 문제도 고려해야 해서 클러스터 하나를 구축하기 위한 사전 작업이 많이 필요한 반면 Docker는 원하는 서버의 환경만 설계해놓으면 아래의 운영체제 환경은 같은 리눅스를 사용하기 때문에 개발자 입장에서 생산성을 높이는 도구가 될 수 있습니다.

 

다음 포스트에서는 CLI에서 Kafka에 직접 Topic을 만들고, 메시지를 Produce하고 Consume하는 글을 작성해보겠습니다.

 

 

 

참고: Kafka 클러스터 구축 compose.yml

(https://github.com/conduktor/kafka-stack-docker-compose)

반응형

Tistory Comments 1