Kafka Docker-Compose + Frpc

in with 0 comment

Kafka Docker 配置文档

服务概览

服务容器名称端口镜像
Zookeeperzookeeper2181confluentinc/cp-zookeeper:latest
Kafkakafka9092, 9101confluentinc/cp-kafka:latest

认证配置

SASL/PLAIN 认证

用户账号

用户名密码用途
adminadmin123管理员账号
kafkakafka123应用账号

连接配置

Kafka 客户端配置

bootstrap.servers=localhost:9092
security.protocol=SASL_PLAINTEXT
sasl.mechanism=PLAIN
sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin123";

服务访问地址

使用命令

启动服务

docker compose up -d

停止服务

docker compose down

查看日志

docker compose logs -f kafka

删除卷

docker compose down -V

示例操作

进入 docker exec -it kafka bash

创建主题

    kafka-topics --create \
        --topic text_topic \
        --partitions 9 \
        --replication-factor 1 \
        --bootstrap-server localhost:9092 \

生产消息

  kafka-console-producer --topic text_topic --bootstrap-server localhost:9092

消费消息

  kafka-console-consumer --topic text_topic --from-beginning --bootstrap-server localhost:9092
  # 带消费组
  kafka-console-consumer --topic text_topic --from-beginning --bootstrap-server localhost:9092 --group my-consumer-group

查看主题列表

  kafka-topics --list --bootstrap-server localhost:9092

查看主题未消费数量 (消费者组 Lag)

kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group my-consumer-group

配置文件

docker-compose.yml

主服务配置文件,包含所有环境变量和端口映射。

kafka_server_jaas.conf

SASL 认证配置文件,定义用户和密码:

数据持久化

使用 Docker volumes 进行数据持久化:

网络配置

所有服务运行在自定义的 kafka-network 网络中,确保容器间通信。

Docker-compose

version: "3.8"

services:
  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    hostname: zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
    volumes:
      - zookeeper_data:/var/lib/zookeeper/data
      - zookeeper_logs:/var/lib/zookeeper/log
    networks:
      - kafka-network

  kafka:
    image: confluentinc/cp-kafka:7.4.0
    hostname: kafka
    container_name: kafka
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
      - "9101:9101"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"

      # 明确监听所有接口的 9092 端口,并使用 PLAINTEXT 协议
      KAFKA_LISTENERS: "PLAINTEXT://0.0.0.0:9092"
      # 广告给客户端的地址:外部通过 FRP 访问 8951,内部服务访问 kafka:29092
      KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://frpc_host:frpc_port"

      # 安全协议映射(虽然只用了一个,但保持清晰)
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "PLAINTEXT:PLAINTEXT"

      # 指定 broker 间通信使用的监听器名称
      KAFKA_INTER_BROKER_LISTENER_NAME: "PLAINTEXT"

      # 其他常规配置
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_JMX_PORT: 9101
      KAFKA_JMX_HOSTNAME: localhost
      KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"
      KAFKA_DELETE_TOPIC_ENABLE: "true"
      KAFKA_HEAP_OPTS: "-Xmx1G -Xms1G"

    volumes:
      - kafka_data:/var/lib/kafka/data
      # 不再挂载 JAAS 文件,因为我们是 PLAINTEXT 模式
    networks:
      - kafka-network

volumes:
  zookeeper_data:
    driver: local
  zookeeper_logs:
    driver: local
  kafka_data:
    driver: local

networks:
  kafka-network:
    driver: bridge

kafka_server_jaas.conf

KafkaServer {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="admin123"
    user_admin="admin123"
    user_kafka="kafka123";
};

Client {
    org.apache.zookeeper.server.auth.DigestLoginModule required
    username="admin"
    password="admin123";
};
Responses