文章

docker下的Kafka分布式部署

在windows下(docker-desktop)进行docker分布式部署kafka环境时,遇到了部分网络问题,具体问题细节不清楚了。大致可以归结到端口映射上去。

如下,kafka内部端口为9092,不需要映射到容器外部。广播端口为19092,需要广播。

另外,在外部通信ip部分,为了便捷性,请尽量填写回环地址。实际生产环境虽然不推荐,但是这个可以避免你使用自身ip地址被自己电脑防火墙拦住的可能性(我被拦了)。windows开防火墙没了解过,也不想学,hhhh。已经被服务器的 网关安全组功能养成傻子了,可视化真好用。

services:
  kafka1:
    container_name: kafka1
    image: bitnami/kafka:3.6.1
    user: root
    ports:
      - "19092:19092"  # 外部端口映射到外部监听器端口
      - "19093:9093"
    environment:
      # 允许使用KRaft
      - KAFKA_ENABLE_KRAFT=yes
      - KAFKA_CFG_PROCESS_ROLES=broker,controller
      - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
      # 定义监听器名称与安全协议的映射关系
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
      # 定义监听器:内部网络用9092,外部网络用19092,控制器用9093
      - KAFKA_CFG_LISTENERS=INTERNAL://:9092,EXTERNAL://:19092,CONTROLLER://:9093
      # 定义宣告地址:内部用服务名,外部用宿主机IP
      - KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://kafka1:9092,EXTERNAL://localhost:19092
      # 指定broker间通信使用内部监听器
      - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL
      - KAFKA_CFG_NODE_ID=1
      - KAFKA_KRAFT_CLUSTER_ID=iZWRiSqjZAlYwlKEqHFQWI
      # 使用服务名作为控制器地址,更具弹性
      - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
      - ALLOW_PLAINTEXT_LISTENER=yes
      # 设置broker最大内存和初始内存
      - KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
    volumes:
      # 挂载路径,标红处修改为自己的路径
      - /E/dockers/volume/kafka/broker01:/bitnami/kafka:rw
    networks:
      netkafka:
        ipv4_address: 172.23.0.11

  kafka2:
    container_name: kafka2
    image: bitnami/kafka:3.6.1
    user: root
    ports:
      - "29092:29092"  # 外部端口映射到外部监听器端口
      - "29093:9093"
    environment:
      - KAFKA_ENABLE_KRAFT=yes
      - KAFKA_CFG_PROCESS_ROLES=broker,controller
      - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
      # 定义监听器名称与安全协议的映射关系
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
      # 定义监听器:内部网络用9092,外部网络用29092,控制器用9093
      - KAFKA_CFG_LISTENERS=INTERNAL://:9092,EXTERNAL://:29092,CONTROLLER://:9093
      # 定义宣告地址:内部用服务名,外部用宿主机IP
      - KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://kafka2:9092,EXTERNAL://localhost:29092
      # 指定broker间通信使用内部监听器
      - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL
      - KAFKA_CFG_NODE_ID=2
      - KAFKA_KRAFT_CLUSTER_ID=iZWRiSqjZAlYwlKEqHFQWI # 三个节点保持一致
      # 使用服务名作为控制器地址,更具弹性
      - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
      - ALLOW_PLAINTEXT_LISTENER=yes
      - KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
    volumes:
      # 挂载路径,标红处修改为自己的路径
      - /E/dockers/volume/kafka/broker02:/bitnami/kafka:rw
    networks:
      netkafka:
        ipv4_address: 172.23.0.12

  kafka3:
    container_name: kafka3
    image: bitnami/kafka:3.6.1
    user: root
    ports:
      - "39092:39092"  # 外部端口映射到外部监听器端口
      - "39093:9093"
    environment:
      - KAFKA_ENABLE_KRAFT=yes
      - KAFKA_CFG_PROCESS_ROLES=broker,controller
      - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
      # 定义监听器名称与安全协议的映射关系
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
      # 定义监听器:内部网络用9092,外部网络用39092,控制器用9093
      - KAFKA_CFG_LISTENERS=INTERNAL://:9092,EXTERNAL://:39092,CONTROLLER://:9093
      # 定义宣告地址:内部用服务名,外部用宿主机IP
      - KAFKA_CFG_ADVERTISED_LISTENERS=INTERNAL://kafka3:9092,EXTERNAL://localhost:39092
      # 指定broker间通信使用内部监听器
      - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=INTERNAL
      - KAFKA_CFG_NODE_ID=3
      - KAFKA_KRAFT_CLUSTER_ID=iZWRiSqjZAlYwlKEqHFQWI
      # 使用服务名作为控制器地址,更具弹性
      - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka1:9093,2@kafka2:9093,3@kafka3:9093
      - ALLOW_PLAINTEXT_LISTENER=yes
      - KAFKA_HEAP_OPTS=-Xmx512M -Xms256M
    volumes:
      # 挂载路径,标红处修改为自己的路径
      - /E/dockers/volume/kafka/broker03:/bitnami/kafka:rw
    networks:
      netkafka:
        ipv4_address: 172.23.0.13

networks:
  netkafka:
    external: true
    driver: bridge
    name: netkafka
    ipam:
      driver: default
      config:
        - subnet: 172.23.0.0/25
          gateway: 172.23.0.1

许可协议:  CC BY 4.0