使用 docker-compose 创建Kafka集群

50 min read

要使用 docker-compose 创建 Kafka 集群,需要编写一个 docker-compose.yml 文件,其中包含 Kafka 服务的定义和配置。

以下是一个简单的 docker-compose.yml 文件,包含 3 个 Kafka 服务和 1 个 ZooKeeper 服务的定义:

version: '3'
services:
  zookeeper:
    image: 'zookeeper:3.5'
    ports:
      - '2181:2181'

  kafka-1:
    image: 'wurstmeister/kafka:2.12-2.5.0'
    depends_on:
      - zookeeper
    ports:
      - '9091:9091'
    environment:
      KAFKA_ADVERTISED_LISTENERS: INSIDE://:9092,OUTSIDE://localhost:9091
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_BROKER_ID: 1001
    volumes:
      - './kafka-1/logs:/opt/kafka/logs'
      - './kafka-1/data:/opt/kafka/data'
    networks:
      - kafka-net

  kafka-2:
    image: 'wurstmeister/kafka:2.12-2.5.0'
    depends_on:
      - zookeeper
    ports:
      - '9092:9092'
    environment:
      KAFKA_ADVERTISED_LISTENERS: INSIDE://:9092,OUTSIDE://localhost:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_BROKER_ID: 1002
    volumes:
      - './kafka-2/logs:/opt/kafka/logs'
      - './kafka-2/data:/opt/kafka/data'
    networks:
      - kafka-net

  kafka-3:
    image: 'wurstmeister/kafka:2.12-2.5.0'
    depends_on:
      - zookeeper
    ports:
      - '9093:9093'
    environment:
      KAFKA_ADVERTISED_LISTENERS: INSIDE://:9092,OUTSIDE://localhost:9093
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_BROKER_ID: 1003
    volumes:
      - './kafka-3/logs:/opt/kafka/logs'
      - './kafka-3/data:/opt/kafka/data'
    networks:
      - kafka-net

networks:
  kafka-net:

在上面的 docker-compose.yml 文件中,共定义了 4 个服务:

  • zookeeper:一个 ZooKeeper 服务,用于协调 Kafka 集群的节点之间的通信。
  • kafka-1kafka-2kafka-3:三个 Kafka 服务,分别代表 Kafka 集群的三个节点。
  • kafka-net:一个自定义的 Docker 网络,用于连接 Kafka 节点和 ZooKeeper 节点。

上述 Kafka 服务的配置包含以下内容:

  • depends_on:用于指定服务之间的依赖关系。在此例中,Kafka 服务依赖于 ZooKeeper 服务。
  • ports:指定服务的端口号,用于外部访问 Kafka 集群。
  • environment:通过环境变量设置 Kafka 的配置选项,例如 KAFKA_ZOOKEEPER_CONNECT 指定 ZooKeeper 服务的地址和端口号。
  • volumes:指定挂载数据卷的路径,用于将 Kafka 日志和数据保存到本地磁盘上。
  • networks:指定服务所在的 Docker 网络。

Kafka 集群启动后,可以通过命令 docker-compose up 启动服务。或者使用 docker-compose up -d 启动服务,并将服务放入后台运行。

运行完 docker-compose up 命令后,可以使用以下命令验证 Kafka 集群的运行状况:

docker exec -it <kafka-1-container-id> kafka-topics --create --topic test-topic \
--partitions 3 --replication-factor 3 --bootstrap-server kafka-1:9092,kafka-2:9092,kafka-3:9092

docker exec -it <kafka-1-container-id> kafka-console-producer --topic test-topic --bootstrap-server kafka-1:9092

docker exec -it <kafka-2-container-id> kafka-console-consumer --topic test-topic --from-beginning --bootstrap-server kafka-1:9092,kafka-2:9092,kafka-3:9092

这些命令用于创建一个名为 test-topic 的 Kafka 主题,并在此主题上进行生产者和消费者测试。验证成功后,即可将 Kafka 集群集成到应用程序中。