docker-compose方式部署kafka集群(Kraft方式)——筑梦之路

bash 复制代码
# =============================================================================
# Kafka Docker Compose 部署变量模板
# 用法:cp docker-compose.env.example .env  然后按需修改(三个 compose 文件共用本文件)
# 注意:.env 与 compose 文件必须放在同一个目录下
# =============================================================================

# 镜像(Apache 官方 JVM 镜像;实验性的 native 版 apache/kafka-native 不建议生产使用)
KAFKA_IMAGE=apache/kafka:4.3.1

# KRaft 集群 ID:同一集群所有节点必须完全一致,且首次格式化后不可随意更换
# 生成方式:docker run --rm apache/kafka:4.3.1 /opt/kafka/bin/kafka-storage.sh random-uuid
CLUSTER_ID=4L6g3nShT-eMCtK--X86sw

# 客户端连接 Kafka 时使用的主机名/IP ------ 必须是"客户端所在机器能访问到"的地址
#   · 客户端就在本机(宿主机)        → localhost
#   · 客户端是局域网内其他机器        → 填宿主机 IP,例如 192.168.1.100
#   · 客户端是云主机外部的机器        → 填公网 IP 或域名
# 填错的典型症状:客户端能连上 bootstrap,但随后报超时/连接被拒(拿到的是连不通的地址)
HOST_ADVERTISED_HOST=localhost

# 单节点模式下映射到宿主机的 Kafka 端口
HOST_KAFKA_PORT=9092
bash 复制代码
# =============================================================================
# Apache Kafka KRaft 模式 · Docker Compose 单节点部署
# 镜像:apache/kafka:4.3.1(Apache 官方 JVM 镜像)
# 用途:本地开发、功能测试、单机小规模场景
#
# 用法:
#   cp docker-compose.env.example .env      # 按需修改 CLUSTER_ID / HOST_ADVERTISED_HOST
#   docker compose -f docker-compose-single-node.yml up -d
#   docker compose -f docker-compose-single-node.yml logs -f kafka
#
# 两个必须知道的点:
#   1) 客户端不在本机时,务必把 .env 里的 HOST_ADVERTISED_HOST 改成宿主机 IP/域名,
#      否则客户端拿到的是 localhost:9092,会出现"能连上 bootstrap 但随后超时"。
#   2) 数据目录必须显式设为 KAFKA_LOG_DIRS=/var/lib/kafka/data 并挂载卷;
#      镜像默认的 /tmp/kraft-combined-logs 位于容器可写层,容器一删数据就没了。
# =============================================================================
name: kafka-single

services:
  kafka:
    image: ${KAFKA_IMAGE:-apache/kafka:4.3.1}
    hostname: kafka
    container_name: kafka
    restart: unless-stopped
    # Kafka 关停需要时间落盘,留足优雅退出时间
    stop_grace_period: 60s
    ports:
      # 宿主机客户端入口(对应 PLAINTEXT_HOST 监听器)
      - "${HOST_KAFKA_PORT:-9092}:9092"
    volumes:
      - kafka-data:/var/lib/kafka/data
    environment:
      # ---------- 集群标识 ----------
      CLUSTER_ID: ${CLUSTER_ID:-4L6g3nShT-eMCtK--X86sw}

      # ---------- KRaft 角色 ----------
      KAFKA_NODE_ID: 1
      KAFKA_PROCESS_ROLES: broker,controller

      # ---------- 监听器 ----------
      # PLAINTEXT      :容器间/集群内部通信(不映射到宿主机)
      # CONTROLLER     :KRaft 控制器通信
      # PLAINTEXT_HOST :给宿主机/外部客户端的入口
      KAFKA_LISTENERS: PLAINTEXT://:19092,CONTROLLER://:29093,PLAINTEXT_HOST://:9092
      # advertised 必须是"客户端真正能连到的地址",且不要包含 CONTROLLER 监听器
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:19092,PLAINTEXT_HOST://${HOST_ADVERTISED_HOST:-localhost}:${HOST_KAFKA_PORT:-9092}
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka:29093

      # ---------- 存储 ----------
      KAFKA_LOG_DIRS: /var/lib/kafka/data

      # ---------- 单节点副本因子(集群文件里是 3)----------
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_SHARE_COORDINATOR_STATE_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_SHARE_COORDINATOR_STATE_TOPIC_MIN_ISR: 1
      KAFKA_DEFAULT_REPLICATION_FACTOR: 1
      KAFKA_MIN_INSYNC_REPLICAS: 1

      # ---------- 常规参数 ----------
      # 开发环境想省去手动建 topic,可把下面这行改成 "true"
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_LOG_RETENTION_HOURS: 168
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0

      # ---------- JVM ----------
      # 堆建议取容器内存上限的约 1/2,其余留给页缓存和直接内存
      KAFKA_HEAP_OPTS: -Xms512m -Xmx512m

      # 只在内网使用时,可把上面 advertised 的 HOST_ADVERTISED_HOST 设为内网 IP,
      # 并把 ports 改成 "127.0.0.1:9092:9092" 限制只允许本机访问。
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
    healthcheck:
      # 能响应 Broker API 才算健康;每次探测会启动一个 JVM,开销可接受
      test:
        - CMD-SHELL
        - /opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server localhost:19092 >/dev/null 2>&1
      interval: 15s
      timeout: 10s
      retries: 10
      start_period: 30s
    deploy:
      resources:
        limits:
          cpus: "2"
          memory: 2g
        reservations:
          cpus: "0.5"
          memory: 1g

  # ---------------------------------------------------------------- 可选:图形界面
  # 如需 Web 界面,去掉下面的注释即可(第三方镜像,按需评估后使用)
  # kafka-ui:
  #   image: provectuslabs/kafka-ui:latest
  #   container_name: kafka-ui
  #   restart: unless-stopped
  #   depends_on:
  #     kafka:
  #       condition: service_healthy
  #   ports:
  #     - "8080:8080"
  #   environment:
  #     KAFKA_CLUSTERS_0_NAME: local
  #     KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:19092

volumes:
  kafka-data:
    driver: local
    # 想用宿主机目录(bind mount)时,改用下面写法,并先把目录属主改成 uid 1000:
    #   sudo mkdir -p /data/kafka && sudo chown -R 1000:1000 /data/kafka
    # 然后把上面的 "kafka-data:/var/lib/kafka/data" 换成 "/data/kafka:/var/lib/kafka/data"
    # driver_opts:
    #   type: none
    #   o: bind
    #   device: /data/kafka
bash 复制代码
# =============================================================================
# Apache Kafka KRaft 模式 · Docker Compose 三节点集群(Combined:broker + controller 合一)
# 镜像:apache/kafka:4.3.1(Apache 官方 JVM 镜像)
# 用途:单机上跑出可容 1 节点故障的 3 副本集群;小规模生产、预发、联调
#
# 用法:
#   cp docker-compose.env.example .env
#   docker compose -f docker-compose-cluster-3node.yml up -d
#   docker compose -f docker-compose-cluster-3node.yml ps
#
# 拓扑:
#   kafka-1  内部 19092 / 控制器 9093 / 宿主机 29092
#   kafka-2  内部 19092 / 控制器 9093 / 宿主机 39092
#   kafka-3  内部 19092 / 控制器 9093 / 宿主机 49092
#
# 注意:三个节点共用 .env 里的 CLUSTER_ID(必须一致),
#      但 node.id、advertised.listeners、宿主机端口各自不同,已在下方逐个写死。
# =============================================================================
name: kafka-cluster

services:
  kafka-1:
    image: ${KAFKA_IMAGE:-apache/kafka:4.3.1}
    hostname: kafka-1
    container_name: kafka-1
    restart: unless-stopped
    stop_grace_period: 60s
    ports:
      - "29092:9092"
    volumes:
      - kafka-1-data:/var/lib/kafka/data
    environment:
      CLUSTER_ID: ${CLUSTER_ID:-4L6g3nShT-eMCtK--X86sw}
      KAFKA_NODE_ID: 1
      KAFKA_PROCESS_ROLES: broker,controller
      KAFKA_LISTENERS: PLAINTEXT://:19092,CONTROLLER://:9093,PLAINTEXT_HOST://:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-1:19092,PLAINTEXT_HOST://${HOST_ADVERTISED_HOST:-localhost}:29092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093
      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_SHARE_COORDINATOR_STATE_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_SHARE_COORDINATOR_STATE_TOPIC_MIN_ISR: 2
      KAFKA_DEFAULT_REPLICATION_FACTOR: 3
      KAFKA_MIN_INSYNC_REPLICAS: 2
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_LOG_RETENTION_HOURS: 168
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_HEAP_OPTS: -Xms1g -Xmx1g
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
    healthcheck:
      test:
        - CMD-SHELL
        - /opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server localhost:19092 >/dev/null 2>&1
      interval: 15s
      timeout: 10s
      retries: 10
      start_period: 40s
    deploy:
      resources:
        limits:
          cpus: "2"
          memory: 3g

  kafka-2:
    image: ${KAFKA_IMAGE:-apache/kafka:4.3.1}
    hostname: kafka-2
    container_name: kafka-2
    restart: unless-stopped
    stop_grace_period: 60s
    ports:
      - "39092:9092"
    volumes:
      - kafka-2-data:/var/lib/kafka/data
    environment:
      CLUSTER_ID: ${CLUSTER_ID:-4L6g3nShT-eMCtK--X86sw}
      KAFKA_NODE_ID: 2
      KAFKA_PROCESS_ROLES: broker,controller
      KAFKA_LISTENERS: PLAINTEXT://:19092,CONTROLLER://:9093,PLAINTEXT_HOST://:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-2:19092,PLAINTEXT_HOST://${HOST_ADVERTISED_HOST:-localhost}:39092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093
      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_SHARE_COORDINATOR_STATE_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_SHARE_COORDINATOR_STATE_TOPIC_MIN_ISR: 2
      KAFKA_DEFAULT_REPLICATION_FACTOR: 3
      KAFKA_MIN_INSYNC_REPLICAS: 2
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_LOG_RETENTION_HOURS: 168
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_HEAP_OPTS: -Xms1g -Xmx1g
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
    healthcheck:
      test:
        - CMD-SHELL
        - /opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server localhost:19092 >/dev/null 2>&1
      interval: 15s
      timeout: 10s
      retries: 10
      start_period: 40s
    deploy:
      resources:
        limits:
          cpus: "2"
          memory: 3g

  kafka-3:
    image: ${KAFKA_IMAGE:-apache/kafka:4.3.1}
    hostname: kafka-3
    container_name: kafka-3
    restart: unless-stopped
    stop_grace_period: 60s
    ports:
      - "49092:9092"
    volumes:
      - kafka-3-data:/var/lib/kafka/data
    environment:
      CLUSTER_ID: ${CLUSTER_ID:-4L6g3nShT-eMCtK--X86sw}
      KAFKA_NODE_ID: 3
      KAFKA_PROCESS_ROLES: broker,controller
      KAFKA_LISTENERS: PLAINTEXT://:19092,CONTROLLER://:9093,PLAINTEXT_HOST://:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-3:19092,PLAINTEXT_HOST://${HOST_ADVERTISED_HOST:-localhost}:49092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka-1:9093,2@kafka-2:9093,3@kafka-3:9093
      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_SHARE_COORDINATOR_STATE_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_SHARE_COORDINATOR_STATE_TOPIC_MIN_ISR: 2
      KAFKA_DEFAULT_REPLICATION_FACTOR: 3
      KAFKA_MIN_INSYNC_REPLICAS: 2
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_LOG_RETENTION_HOURS: 168
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_HEAP_OPTS: -Xms1g -Xmx1g
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
    healthcheck:
      test:
        - CMD-SHELL
        - /opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server localhost:19092 >/dev/null 2>&1
      interval: 15s
      timeout: 10s
      retries: 10
      start_period: 40s
    deploy:
      resources:
        limits:
          cpus: "2"
          memory: 3g

volumes:
  kafka-1-data:
  kafka-2-data:
  kafka-3-data:
bash 复制代码
# =============================================================================
# Apache Kafka KRaft 模式 · Docker Compose 角色分离(Isolated:controller / broker 各自独立)
# 镜像:apache/kafka:4.3.1(Apache 官方 JVM 镜像)
# 用途:生产取向。controller 只做元数据共识,不受 broker 流量影响,可独立扩缩容
#
# 用法:
#   cp docker-compose.env.example .env
#   docker compose -f docker-compose-isolated.yml up -d
#
# 拓扑(6 个容器):
#   controller-1/2/3   node.id=1/2/3  仅 CONTROLLER 监听 9093(不对外暴露端口)
#   kafka-1/2/3        node.id=4/5/6  内部 19092 / 宿主机 29092、39092、49092
#
# 关键约束:controller-only 节点严禁设置 KAFKA_ADVERTISED_LISTENERS,
#          官方启动脚本会直接报错退出("KAFKA_ADVERTISED_LISTENERS is not supported on a KRaft controller.")
# =============================================================================
name: kafka-isolated

services:
  # ================================ Controller 层 ================================
  controller-1:
    image: ${KAFKA_IMAGE:-apache/kafka:4.3.1}
    hostname: controller-1
    container_name: controller-1
    restart: unless-stopped
    stop_grace_period: 60s
    volumes:
      - controller-1-data:/var/lib/kafka/data
    environment:
      CLUSTER_ID: ${CLUSTER_ID:-4L6g3nShT-eMCtK--X86sw}
      KAFKA_NODE_ID: 1
      KAFKA_PROCESS_ROLES: controller
      KAFKA_LISTENERS: CONTROLLER://:9093
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093
      KAFKA_LOG_DIRS: /var/lib/kafka/data
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_HEAP_OPTS: -Xms512m -Xmx512m
    healthcheck:
      test:
        - CMD-SHELL
        - /opt/kafka/bin/kafka-metadata-quorum.sh --bootstrap-controller localhost:9093 describe --status >/dev/null 2>&1
      interval: 15s
      timeout: 10s
      retries: 10
      start_period: 30s
    deploy:
      resources:
        limits:
          cpus: "1"
          memory: 2g

  controller-2:
    image: ${KAFKA_IMAGE:-apache/kafka:4.3.1}
    hostname: controller-2
    container_name: controller-2
    restart: unless-stopped
    stop_grace_period: 60s
    volumes:
      - controller-2-data:/var/lib/kafka/data
    environment:
      CLUSTER_ID: ${CLUSTER_ID:-4L6g3nShT-eMCtK--X86sw}
      KAFKA_NODE_ID: 2
      KAFKA_PROCESS_ROLES: controller
      KAFKA_LISTENERS: CONTROLLER://:9093
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093
      KAFKA_LOG_DIRS: /var/lib/kafka/data
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_HEAP_OPTS: -Xms512m -Xmx512m
    healthcheck:
      test:
        - CMD-SHELL
        - /opt/kafka/bin/kafka-metadata-quorum.sh --bootstrap-controller localhost:9093 describe --status >/dev/null 2>&1
      interval: 15s
      timeout: 10s
      retries: 10
      start_period: 30s
    deploy:
      resources:
        limits:
          cpus: "1"
          memory: 2g

  controller-3:
    image: ${KAFKA_IMAGE:-apache/kafka:4.3.1}
    hostname: controller-3
    container_name: controller-3
    restart: unless-stopped
    stop_grace_period: 60s
    volumes:
      - controller-3-data:/var/lib/kafka/data
    environment:
      CLUSTER_ID: ${CLUSTER_ID:-4L6g3nShT-eMCtK--X86sw}
      KAFKA_NODE_ID: 3
      KAFKA_PROCESS_ROLES: controller
      KAFKA_LISTENERS: CONTROLLER://:9093
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093
      KAFKA_LOG_DIRS: /var/lib/kafka/data
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_HEAP_OPTS: -Xms512m -Xmx512m
    healthcheck:
      test:
        - CMD-SHELL
        - /opt/kafka/bin/kafka-metadata-quorum.sh --bootstrap-controller localhost:9093 describe --status >/dev/null 2>&1
      interval: 15s
      timeout: 10s
      retries: 10
      start_period: 30s
    deploy:
      resources:
        limits:
          cpus: "1"
          memory: 2g

  # ================================== Broker 层 ==================================
  kafka-1:
    image: ${KAFKA_IMAGE:-apache/kafka:4.3.1}
    hostname: kafka-1
    container_name: kafka-1
    restart: unless-stopped
    stop_grace_period: 60s
    depends_on:
      - controller-1
      - controller-2
      - controller-3
    ports:
      - "29092:9092"
    volumes:
      - kafka-1-data:/var/lib/kafka/data
    environment:
      CLUSTER_ID: ${CLUSTER_ID:-4L6g3nShT-eMCtK--X86sw}
      KAFKA_NODE_ID: 4
      KAFKA_PROCESS_ROLES: broker
      KAFKA_LISTENERS: PLAINTEXT://:19092,PLAINTEXT_HOST://:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-1:19092,PLAINTEXT_HOST://${HOST_ADVERTISED_HOST:-localhost}:29092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093
      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_SHARE_COORDINATOR_STATE_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_SHARE_COORDINATOR_STATE_TOPIC_MIN_ISR: 2
      KAFKA_DEFAULT_REPLICATION_FACTOR: 3
      KAFKA_MIN_INSYNC_REPLICAS: 2
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_LOG_RETENTION_HOURS: 168
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_HEAP_OPTS: -Xms2g -Xmx2g
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
    healthcheck:
      test:
        - CMD-SHELL
        - /opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server localhost:19092 >/dev/null 2>&1
      interval: 15s
      timeout: 10s
      retries: 10
      start_period: 40s
    deploy:
      resources:
        limits:
          cpus: "2"
          memory: 4g

  kafka-2:
    image: ${KAFKA_IMAGE:-apache/kafka:4.3.1}
    hostname: kafka-2
    container_name: kafka-2
    restart: unless-stopped
    stop_grace_period: 60s
    depends_on:
      - controller-1
      - controller-2
      - controller-3
    ports:
      - "39092:9092"
    volumes:
      - kafka-2-data:/var/lib/kafka/data
    environment:
      CLUSTER_ID: ${CLUSTER_ID:-4L6g3nShT-eMCtK--X86sw}
      KAFKA_NODE_ID: 5
      KAFKA_PROCESS_ROLES: broker
      KAFKA_LISTENERS: PLAINTEXT://:19092,PLAINTEXT_HOST://:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-2:19092,PLAINTEXT_HOST://${HOST_ADVERTISED_HOST:-localhost}:39092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093
      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_SHARE_COORDINATOR_STATE_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_SHARE_COORDINATOR_STATE_TOPIC_MIN_ISR: 2
      KAFKA_DEFAULT_REPLICATION_FACTOR: 3
      KAFKA_MIN_INSYNC_REPLICAS: 2
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_LOG_RETENTION_HOURS: 168
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_HEAP_OPTS: -Xms2g -Xmx2g
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
    healthcheck:
      test:
        - CMD-SHELL
        - /opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server localhost:19092 >/dev/null 2>&1
      interval: 15s
      timeout: 10s
      retries: 10
      start_period: 40s
    deploy:
      resources:
        limits:
          cpus: "2"
          memory: 4g

  kafka-3:
    image: ${KAFKA_IMAGE:-apache/kafka:4.3.1}
    hostname: kafka-3
    container_name: kafka-3
    restart: unless-stopped
    stop_grace_period: 60s
    depends_on:
      - controller-1
      - controller-2
      - controller-3
    ports:
      - "49092:9092"
    volumes:
      - kafka-3-data:/var/lib/kafka/data
    environment:
      CLUSTER_ID: ${CLUSTER_ID:-4L6g3nShT-eMCtK--X86sw}
      KAFKA_NODE_ID: 6
      KAFKA_PROCESS_ROLES: broker
      KAFKA_LISTENERS: PLAINTEXT://:19092,PLAINTEXT_HOST://:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-3:19092,PLAINTEXT_HOST://${HOST_ADVERTISED_HOST:-localhost}:49092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093
      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_SHARE_COORDINATOR_STATE_TOPIC_REPLICATION_FACTOR: 3
      KAFKA_SHARE_COORDINATOR_STATE_TOPIC_MIN_ISR: 2
      KAFKA_DEFAULT_REPLICATION_FACTOR: 3
      KAFKA_MIN_INSYNC_REPLICAS: 2
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false"
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_LOG_RETENTION_HOURS: 168
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_HEAP_OPTS: -Xms2g -Xmx2g
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
    healthcheck:
      test:
        - CMD-SHELL
        - /opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server localhost:19092 >/dev/null 2>&1
      interval: 15s
      timeout: 10s
      retries: 10
      start_period: 40s
    deploy:
      resources:
        limits:
          cpus: "2"
          memory: 4g

volumes:
  controller-1-data:
  controller-2-data:
  controller-3-data:
  kafka-1-data:
  kafka-2-data:
  kafka-3-data:

仅供参考

相关推荐
JavaPub-rodert2 小时前
Docker 镜像地址总失效?基于 DockerHub 项目用 GitHub Actions 做一个自动检测状态页
docker·容器·github
天衍四九-2 小时前
Docker 进阶实战系列(一):容器镜像安全,最小镜像与非 Root 运行
安全·docker·eureka
天衍四九-2 小时前
Docker进阶实战系列(二):容器日志深度治理|驱动配置、自动切割、磁盘爆满彻底解决
docker·容器·eureka
sbjdhjd3 小时前
云安全 | Docker 容器逃逸复盘(一):从隔离边界到运行时链路,如何确认自己身处容器
网络安全·docker·云原生·容器·kubernetes·云计算·云安全
溪语流沙3 小时前
【Web全栈进阶】PostgreSQL上手:Docker跑库 + 把早报站从SQLite迁过去
前端·docker·postgresql
梦想不只是梦与想13 小时前
docker-compose.yml
docker·docker-compose·docker run
更深兼春远1 天前
第2篇:Dify 部署保姆级教程:用 Docker跑起来
docker·容器·dify
小白的码BUG之路1 天前
Docker -- No space left on device
运维·docker·容器
wzq11_6661 天前
Kubernetes集群——Service篇(详细讲解!!!)
云原生·容器·kubernetes