docker单机部署kafka

docker单机部署kafka

官方镜像地址:apache/kafka - Docker 镜像 |Docker 中心

官方给的命令,部署之后,用工具访问不了:

image-20250208171102436

services:
  broker:
    image: apache/kafka:latest
    container_name: broker
    environment:
      KAFKA_NODE_ID: 1
      KAFKA_PROCESS_ROLES: broker,controller
      KAFKA_LISTENERS: PLAINTEXT://localhost:9092,CONTROLLER://localhost:9093
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9093
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_NUM_PARTITIONS: 3

docker-compose文件,host模式:

services:
  kafka:
    image: apache/kafka:3.9.0      # 使用官方最新版 Kafka 镜像
    container_name: kafka          # 容器命名为 kafka
    restart: always
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
    environment:
      TZ: Asia/Shanghai
      # 核心身份配置
      KAFKA_NODE_ID: 1             # 节点唯一标识符(集群中不可重复)
      KAFKA_PROCESS_ROLES: broker,controller # 同时扮演 Broker 和 Controller 角色
      
      # 网络监听配置
      KAFKA_LISTENERS: PLAINTEXT://192.168.0.238:9092,CONTROLLER://192.168.0.238:9093
      # - PLAINTEXT 监听器用于客户端通信(生产者/消费者)
      # - CONTROLLER 监听器用于集群内部通信
      
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.0.238:9092 # 对外暴露的地址
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER            # 指定控制器监听器名称
      
      # 安全协议映射(这里未启用加密)
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
      
      # 集群仲裁配置(单节点模式)
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@192.168.0.238:9093 
      # 格式为 nodeId@host:port,这里只有自己一个投票节点
      
      # 主题配置(单节点优化)
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1     # __consumer_offsets 副本数
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 # 事务日志副本数
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1        # 最小同步副本数
      
      # 消费者组优化
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0     # 快速启动消费者组
      KAFKA_NUM_PARTITIONS: 3                       # 自动创建主题的默认分区数
    volumes:
      - ./data/kafka:/var/lib/kafka/data
      - /etc/localtime:/etc/localtime:ro
    network_mode: host  # 使用宿主机网络模式,避免端口映射问题

docker-compose文件,桥接模式,桥接模式填写容器名称即可获取对应IP地址

services:
  kafka:
    image: apache/kafka:3.9.0      # 使用官方最新版 Kafka 镜像
    container_name: kafka          # 容器命名为 kafka
    restart: always
    ulimits:
      nofile:
        soft: 65536
        hard: 65536
    ports: 
      - "9092:9092"
      - "9093:9093"
    environment:
      TZ: Asia/Shanghai
      # 核心身份配置
      KAFKA_NODE_ID: 1             # 节点唯一标识符(集群中不可重复)
      KAFKA_PROCESS_ROLES: broker,controller # 同时扮演 Broker 和 Controller 角色
      
      # 网络监听配置
      KAFKA_LISTENERS: PLAINTEXT://kafka:9092,CONTROLLER://kafka:9093
      # - PLAINTEXT 监听器用于客户端通信(生产者/消费者)
      # - CONTROLLER 监听器用于集群内部通信
      
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.0.238:9092 # 对外暴露的地址
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER            # 指定控制器监听器名称
      
      # 安全协议映射(这里未启用加密)
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
      
      # 集群仲裁配置(单节点模式)
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@192.168.0.238:9093 
      # 格式为 nodeId@host:port,这里只有自己一个投票节点
      
      # 主题配置(单节点优化)
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1     # __consumer_offsets 副本数
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 # 事务日志副本数
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1        # 最小同步副本数
      
      # 消费者组优化
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0     # 快速启动消费者组
      KAFKA_NUM_PARTITIONS: 3                       # 自动创建主题的默认分区数
    volumes:
      - /etc/localtime:/etc/localtime:ro

docker-compose文件,host模式配置账号密码:

services:
  kafka:
    image: apache/kafka:3.9.0
    container_name: kafka
    environment:
      # Kafka 基本配置
      KAFKA_NODE_ID: 1                                  # Kafka 节点 ID(单节点模式)
      KAFKA_PROCESS_ROLES: broker,controller           # 该节点既是 Broker 也是 Controller
      
      # 监听器配置
      KAFKA_LISTENERS: PLAINTEXT://192.168.0.238:9092,SASL_PLAINTEXT://192.168.0.238:9094,CONTROLLER://192.168.0.238:9093
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.0.238:9092,SASL_PLAINTEXT://192.168.0.238:9094
      
      # 监听器与安全协议映射
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,SASL_PLAINTEXT:SASL_PLAINTEXT,CONTROLLER:PLAINTEXT
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER  # 指定 Controller 监听器

      # **关键修复:添加控制器仲裁配置**
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@192.168.0.238:9093
      # 或者使用:
      # KAFKA_CONTROLLER_QUORUM_BOOTSTRAP_SERVERS: 192.168.0.238:9093

      # 启用 SASL 账号密码认证(使用 PLAIN 方式)
      KAFKA_SASL_ENABLED_MECHANISMS: PLAIN
      KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN
      
      # 指定 Kafka 服务器的 JAAS 认证文件
      KAFKA_OPTS: "-Djava.security.auth.login.config=/opt/kafka/config/kafka_server_jaas.conf"

    volumes:
      - ./kafka_server_jaas.conf:/opt/kafka/config/kafka_server_jaas.conf  # 挂载认证配置文件
      - ./data/kafka:/var/lib/kafka/data  # 持久化 Kafka 数据,避免重启丢失
    
    network_mode: host  # 使用宿主机网络模式,避免端口映射问题

认证配置文件 kafka_server_jaas.conf 内容:

KafkaServer {
  org.apache.kafka.common.security.plain.PlainLoginModule required
  username="youeran"
  password="youeran-kafka-password"
  user_admin="guest"
  user_guest="guest-password";
};

posted @ 2025-02-08 17:15  wandereryjh  阅读(464)  评论(0)    收藏  举报