services: broker1: image: apache/kafka:latest container_name: broker1 environment: KAFKA_KRAFT_CLUSTER_ID: kafka-cluster-3-nodes # Define your cluster ID at .env file KAFKA_NODE_ID: 1 KAFKA_PROCESS_ROLES: "broker,controller" KAFKA_LISTENERS: INTERNAL://:9092,CONTROLLER://:9093,EXTERNAL://:19092 KAFKA_ADVERTISED_LISTENERS: INTERNAL://broker1:9092,EXTERNAL://localhost:19092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER KAFKA_LOG_DIRS: /var/lib/kafka/data KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2 KAFKA_CONTROLLER_QUORUM_VOTERS: 1@broker1:9093,2@broker2:9093,3@broker3:9093 volumes: - /data/kafka/broker/01:/var/lib/kafka/data networks: - kafka-net ports: - "19092:19092" # Expose external port for broker1 restart: unless-stopped broker2: image: apache/kafka:latest container_name: broker2 environment: KAFKA_KRAFT_CLUSTER_ID: kafka-cluster-3-nodes # Define your cluster ID at .env file KAFKA_NODE_ID: 2 KAFKA_PROCESS_ROLES: "broker,controller" KAFKA_LISTENERS: INTERNAL://:9092,CONTROLLER://:9093,EXTERNAL://:19092 KAFKA_ADVERTISED_LISTENERS: INTERNAL://broker2:9092,EXTERNAL://localhost:19092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER KAFKA_LOG_DIRS: /var/lib/kafka/data KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2 KAFKA_CONTROLLER_QUORUM_VOTERS: 1@broker1:9093,2@broker2:9093,3@broker3:9093 volumes: - /data/kafka/broker/02:/var/lib/kafka/data networks: - kafka-net ports: - "19093:19092" # Expose external port for broker2 restart: unless-stopped broker3: image: apache/kafka:latest container_name: broker3 environment: KAFKA_KRAFT_CLUSTER_ID: kafka-cluster-3-nodes # Define your cluster ID at .env file KAFKA_NODE_ID: 3 KAFKA_PROCESS_ROLES: "broker,controller" KAFKA_LISTENERS: INTERNAL://:9092,CONTROLLER://:9093,EXTERNAL://:19092 KAFKA_ADVERTISED_LISTENERS: INTERNAL://broker3:9092,EXTERNAL://localhost:19092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER KAFKA_LOG_DIRS: /var/lib/kafka/data KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 3 KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 3 KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 2 KAFKA_CONTROLLER_QUORUM_VOTERS: 1@broker1:9093,2@broker2:9093,3@broker3:9093 volumes: - /data/kafka/broker/03:/var/lib/kafka/data networks: - kafka-net ports: - "19094:19092" # Expose external port for broker3 restart: unless-stopped kafdrop: image: obsidiandynamics/kafdrop:latest networks: - kafka-net depends_on: - broker1 - broker2 - broker3 ports: - 19000:9000 environment: KAFKA_BROKERCONNECT: broker1:9092,broker2:9092,broker3:9092 restart: unless-stopped networks: kafka-net: driver: bridge