Docker Desktop 버전 2이상 필요하다.
---
version: '2' # Docker compose 버전 지정
services:
zookeeper-1:
image: confluentinc/cp-zookeeper:latest #실전에서는 정확한 버전을 사용 권장
environment:
ZOOKEEPER_SERVER_ID: 1 #클러스터에서 주키퍼를 식별할 아이디.
ZOOKEEPER_CLIENT_PORT: 2181 #컨테이너 내부 포트
ZOOKEEPER_TICK_TIME: 2000 #클러스터를 구성할때 동기화를 위한 틱 타임
ZOOKEEPER_INIT_LIMIT: 5 #주키퍼 클러스터는 쿼럼이라는 과정을 통해 마스터를 선출. 리더에게 커넥션을 맺을때 지정할 초기 타임아웃이다.
ZOOKEEPER_SYNC_LIMIT: 2 #주키퍼 리더와 나머지 서버들의 싱크 타임.
ports:
- "22181:2181"
zookeeper-2:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_SERVER_ID: 2
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
ports:
- "32181:2181"
zookeeper-3:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_SERVER_ID: 3
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ZOOKEEPER_INIT_LIMIT: 5
ZOOKEEPER_SYNC_LIMIT: 2
ports:
- "42181:2181"
kafka-1:
image: confluentinc/cp-kafka:latest #실사용엔 지정된 버전 사용
depends_on:
- zookeeper-1 #서비스들의 우선순위를 지정해준다. zookeeper-1가 먼저 실행되어 있어야 컨테이너가 올라오게 된다.
- zookeeper-2
- zookeeper-3
ports:
- 29092:29092 #브로커의 내부 포트
environment:
KAFKA_BROKER_ID: 1 #브로커 아이디. 단일 브로커기 때문에 없어도 무방하다.
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181 #zookeeper에 커넥션하기 위한 대상을 지정한다.
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-1:9092,PLAINTEXT_HOST://localhost:29092 #외부에서 접속하기 위한 리스너이다.
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT #보안을 위한 프로토콜 매핑
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT #도커 내부에서 사용할 리스너 이름
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 #트랜잭션 상태에서 복제 계수를 지정
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 #트랜잭션 최소 ISR(InSyncReplicas)설정을 지정하는 것으로, 단순 작업하기 위해 복제 계수를 1로 설정.
kafka-2:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
ports:
- "39092:39092"
environment:
KAFKA_BROKER_ID: 2
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-2:9092,PLAINTEXT_HOST://localhost:39092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
kafka-3:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper-1
- zookeeper-2
- zookeeper-3
ports:
- "49092:49092"
environment:
KAFKA_BROKER_ID: 3
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-3:9092,PLAINTEXT_HOST://localhost:49092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
docker-compose -f docker-compose.yml up -d
docker-compose exec kafka-1 kafka-topics --create --topic my-topic --bootstrap-server kafka-1:9092 --replication-factor 3 --partitions 2
docker-compose exec kafka-1 kafka-topics --describe --topic my-topic --bootstrap-server kafka-1:9092
docker-compose exec kafka-1 bash
[appuser@571d813de396 ~]$ kafka-console-consumer --topic my-topic --bootstrap-server kafka-1:9092
docker-compose exec kafka-1 bash
[appuser@571d813de396 ~]$ kafka-console-producer --topic my-topic --broker-list kafka-1:9092
>hello world
>this is producer
컨슈머를 확인하면 hello world, this is producer 라는 메세지를 볼 수 있다.