Kafka 安装说明(Docker)

快速启动

要部署 Kafka 的单代理 Docker 版本,您需要首先 部署 ZooKeeper 服务,并确保 ZooKeeper 服务 Kafka 可以访问。

首先,创建一个网络

docker network create -d bridge kafka-network

部署 ZooKeeper 服务

docker run --detach  --name zookeeper --network kafka-network ubuntu/zookeeper:3.8-22.04_edge

最后,部署Kafka服务

docker run --detach --name kafka --network kafka-network -p 9092:9092 ubuntu/kafka:3.6-22.04_edge

使用命令行

在本例中,我们将创建一个 Apache Kafka 客户端实例,该实例将连接到与客户端在同一码头网络上运行的服务器实例。

步骤1:创建一个网络
docker network create app-tier --driver bridge
步骤2:启动Apache Kafka服务器实例

使用--network app-tier对 的论证docker run命令将 Apache Kafka 容器附加到app-tier网络。

docker run -d --name kafka-server --hostname kafka-server \
    --network app-tier \
    -e KAFKA_CFG_NODE_ID=0 \
    -e KAFKA_CFG_PROCESS_ROLES=controller,broker \
    -e KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \
    -e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT \
    -e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-server:9093 \
    -e KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER \
    bitnami/kafka:latest
步骤 3: 启动您的 Apache Kafka 客户端实例

最后,我们创建一个新的容器实例来启动Apache Kafka客户端,并连接到上一步中创建的服务器:

docker run -it --rm \
    --network app-tier \
    bitnami/kafka:latest kafka-topics.sh --list  --bootstrap-server kafka-server:9092

使用 Docker Compose 文件

未指定时,Docker Compose 会自动设置新网络,并将所有部署的服务附加到该网络。但是,我们将明确定义一个新的bridge网络命名app-tier. .在本例中,我们假设您希望从您自己的自定义应用程序映像连接到Apache Kafka服务器,该图像在以下代码片段中通过服务名称标识myapp. .

version: '2'

networks:
  app-tier:
    driver: bridge

services:
  kafka:
    image: 'bitnami/kafka:latest'
    networks:
      - app-tier
    environment:
      - KAFKA_CFG_NODE_ID=0
      - KAFKA_CFG_PROCESS_ROLES=controller,broker
      - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
      - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093
      - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
  myapp:
    image: 'YOUR_APPLICATION_IMAGE'
    networks:
      - app-tier

IMPORTANT重要事项:
请更新YOUR_APPLICATION_IMAGEplaceholder 在上面的片段与您的应用程序图像
在应用程序容器中,使用主机名kafka连接到 Apache Kafka 服务器

使用以下方法启动容器:

docker-compose up -d

配置
环境变量

可定制环境变量
名称 描述 默认值
KAFKA_MOUNTED_CONF_DIR 用于挂载配置文件的 Kafka 目录。 ${KAFKA_VOLUME_DIR}/config
KAFKA_CLUSTER_ID Kafka 集群 ID。 nil
KAFKA_INITIAL_CONTROLLERS Kafka 群集初始控制器列表。 nil
KAFKA_SKIP_KRAFT_STORAGE_INIT 如果设置为 true,则在配置 process.roles 时跳过 Kraft 存储初始化。 false
KAFKA_CFG_SASL_ENABLED_MECHANISMS 卡夫卡sasl.enabled.mechanisms配置覆盖。 PLAIN,SCRAM-SHA-256,SCRAM-SHA-512
KAFKA_CLIENT_LISTENER_NAME 客户端打算使用的侦听器名称(如果设置)将相应地配置生产者/消费者。 nil
KAFKA_OPTS Kafka 部署选项。 nil
KAFKA_ZOOKEEPER_PROTOCOL 用于 Zookeeper 连接的身份验证协议。允许的协议:PLAINTEXT,SASL, SSL,以及SASL_SSL. . PLAINTEXT
KAFKA_ZOOKEEPER_PASSWORD Kafka Zookeeper 用于 SASL 身份验证的用户密码。 nil
KAFKA_ZOOKEEPER_USER 用于 SASL 身份验证的 Kafka Zookeeper 用户。 nil
KAFKA_ZOOKEEPER_TLS_TYPE 选择要使用的 TLS 证书格式。允许值:JKS,PEM. . JKS
KAFKA_ZOOKEEPER_TLS_TRUSTSTORE_FILE Kafka Zookeeper truststore 文件位置。 nil
KAFKA_ZOOKEEPER_TLS_KEYSTORE_PASSWORD Kafka Zookeeper 密钥库文件密码和密钥密码。 nil
KAFKA_ZOOKEEPER_TLS_TRUSTSTORE_PASSWORD Kafka Zookeeper 信任存储文件密码。 nil
KAFKA_ZOOKEEPER_TLS_VERIFY_HOSTNAME 在 TLS 证书上验证 Zookeeper 主机名。 true
KAFKA_INTER_BROKER_USER Kafka inter 代理通信用户。 user
KAFKA_INTER_BROKER_PASSWORD Kafka inter 代理通信密码。 bitnami
KAFKA_CONTROLLER_USER Kafka 控制平面通信用户。 controller_user
KAFKA_CONTROLLER_PASSWORD 卡夫卡控制飞机通信密码。 bitnami
KAFKA_CERTIFICATE_PASSWORD 证书的密码。 nil
KAFKA_TLS_TRUSTSTORE_FILE Kafka Truststore 文件位置。 nil
KAFKA_TLS_TYPE 选择要使用的 TLS 证书格式。 JKS
KAFKA_TLS_CLIENT_AUTH 配置 kafka 代理以请求客户端身份验证。 required
KAFKA_CLIENT_USERS 使用时将创建的用户列表SASL_SCRAM客户通信。用逗号、分号或空白分隔。 user
KAFKA_CLIENT_PASSWORDS 用户密码指定在KAFKA_CLIENT_USERS. .用逗号、分号或空白分隔。 bitnami
KAFKA_HEAP_OPTS 用于 Java 的 Kafka 堆选项。 -Xmx1024m -Xms1024m
JAVA_TOOL_OPTIONS Java 工具选项。 nil

只读环境变量
名称 描述 价值
KAFKA_BASE_DIR Kafka 安装目录。 ${BITNAMI_ROOT_DIR}/kafka
KAFKA_VOLUME_DIR Kafka 持久性目录。 /bitnami/kafka
KAFKA_DATA_DIR 数据存储的Kafka目录。 ${KAFKA_VOLUME_DIR}/data
KAFKA_CONF_DIR Kafka 配置目录。 ${KAFKA_BASE_DIR}/config
KAFKA_CONF_FILE Kafka 配置文件。 ${KAFKA_CONF_DIR}/server.properties
KAFKA_CERTS_DIR 证书文件的 Kafka 目录。 ${KAFKA_CONF_DIR}/certs
KAFKA_INITSCRIPTS_DIR 用于 init 脚本的 Kafka 目录。 /docker-entrypoint-initdb.d
KAFKA_LOG_DIR 存储 Kafka 日志的目录。 ${KAFKA_BASE_DIR}/logs
KAFKA_HOME Kafka home 目录。 $KAFKA_BASE_DIR
KAFKA_DAEMON_USER Kafka 系统用户。 kafka
KAFKA_DAEMON_GROUP Kafka 系统组。 kafka

此外,任何以KAFKA_CFG_将映射到其相应的 Apache Kafka 密钥。例如,使用KAFKA_CFG_BACKGROUND_THREADS为设置background.threads或KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE为了配置auto.create.topics.enable. .

docker run –name kafka -e KAFKA_CFG_PROCESS_ROLES … -e KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true bitnami/kafka:latest

或通过修改docker-compose.yml⁠

文件存在于此存储库中:

kafka:

environment:

- KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true

Apache Kafka 开发设置示例

要在开发设置中使用 Apache Kafka,请创建以下内容:docker-compose.yml文件:

version: “3”
services:
kafka:
image: ‘bitnami/kafka:latest’
ports:

  - '9092:9092'
environment:
  - KAFKA_CFG_NODE_ID=0
  - KAFKA_CFG_PROCESS_ROLES=controller,broker
  - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
  - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
  - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093
  - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER

要部署它,请在目录中运行以下命令,其中docker-compose.ymlfile 位于:

docker-compose up -d

使用内部和外部客户端访问 Apache Kafka

为了使用内部和外部客户端访问Apache Kafka代理,您需要为每种客户端配置一个侦听器。

为此,请将以下环境变量添加到 docker-compose:

environment:
  - KAFKA_CFG_NODE_ID=0
  - KAFKA_CFG_PROCESS_ROLES=controller,broker
  - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@<your_host>:9093
    • KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093,EXTERNAL://:9094
    • KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,EXTERNAL://localhost:9094
    • KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,EXTERNAL:PLAINTEXT,PLAINTEXT:PLAINTEXT
    • KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER

并暴露外部端口:

(内部,客户端一个仍然可以在Docker网络内使用)

ports:
    • ‘9092:9092’
    • ‘9094:9094’

Note注意 :要从外部机器连接,请更改localhost上面到您的主机的外部IP/主机名,并包括EXTERNAL://0.0.0.0:9094在KAFKA_CFG_LISTENERS允许远程连接。

生产者和消费者使用外部客户端

这些客户端,来自同一个主机,将使用localhost连接到 Apache Kafka。

kafka-console-producer.sh –producer.config /opt/bitnami/kafka/config/producer.properties –bootstrap-server 127.0.0.1:9094 –topic test
kafka-console-consumer.sh –consumer.config /opt/bitnami/kafka/config/consumer.properties –bootstrap-server 127.0.0.1:9094 –topic test –from-beginning

如果从另一台计算机运行这些命令,请相应地更改地址。

生产者和消费者使用内部客户端

这些客户端来自同一 Docker 网络上的其他容器,将使用 kafka 容器服务主机名连接到 Apache Kafka。

kafka-console-producer.sh –producer.config /opt/bitnami/kafka/config/producer.properties –bootstrap-server kafka:9092 –topic test
kafka-console-consumer.sh –consumer.config /opt/bitnami/kafka/config/consumer.properties –bootstrap-server kafka:9092 –topic test –from-beginning

同样,应用程序代码需要使用bootstrap.servers=kafka:9092

有关 Apache Kafka 听众的更多信息,请参阅这篇伟大的文章 ⁠
安全

为了配置身份验证,必须正确配置 Apache Kafka 侦听器。让我们看看一个示例,用于配置 Apache KafkaSASL_SSL与客户通信的身份验证,以及SASL控制器相关通信的身份验证。

应定义下面的环境变量以配置侦听器和用于客户端通信的 SASL 凭据:

KAFKA_CFG_LISTENERS=SASL_SSL://:9092,CONTROLLER://:9093
KAFKA_CFG_ADVERTISED_LISTENERS=SASL_SSL://localhost:9092
KAFKA_CLIENT_USERS=user
KAFKA_CLIENT_PASSWORDS=password
KAFKA_CLIENT_LISTENER_NAME=SASL_SSL
KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL=PLAIN
KAFKA_CONTROLLER_USER=controller_user
KAFKA_CONTROLLER_PASSWORD=controller_password

must您还必须使用自己的 SSL 证书。您可以将 Java 密钥存储或 PEM 文件放入/opt/bitnami/kafka/config/certs. .如果 JKS 或 PEM 证书受密码保护(推荐),则需要提供密钥库才能访问:

KAFKA_CERTIFICATE_PASSWORD=myCertificatePassword

如果 Truststore 安装在不同的位置/opt/bitnami/kafka/config/certs/kafka.truststore.jks,/opt/bitnami/kafka/config/certs/kafka.truststore.pem,/bitnami/kafka/config/certs/kafka.truststore.jks或/bitnami/kafka/config/certs/kafka.truststore.pem, 设置KAFKA_TLS_TRUSTSTORE_FILE变量。

以下脚本可以帮助您创建 JKS 和证书:

kafka-generate-ssl.sh

请记住以下说明:

当提示输入密码时,请对所有密码使用相同的密码。
将 Common NameFQDN 值设置为 Apache Kafka 容器主机名,例如: kafka.example.com. .输入此值后,当提示“你的名字和姓氏是什么?”时,输入此值。
    作为替代方案,您可以禁用主机名验证设置环境变量KAFKA_CFG_SSL_ENDPOINT_IDENTIFICATION_ALGORITHM一个空的字符串。
当设置Apache Kafka集群(检查“设置Apache Kafka集群”以获取更多信息)时,每个Apache Kafka代理和逻辑客户端都需要自己的密钥库。您必须重复群集中每个经纪商的过程。

下面的 docker-compose 文件是一个例子,显示如何挂载受密码保护的 JKS 证书certificatePassword123. .此外,它还指定了 Apache Kafka 容器主机名和客户端用户的凭据。

version: ‘2’

services:
kafka:
image: ‘bitnami/kafka:latest’
hostname: kafka.example.com
ports:

  - '9092'
environment:
  # KRaft
  - KAFKA_CFG_NODE_ID=0
  - KAFKA_CFG_PROCESS_ROLES=controller,broker
  - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093
  # Listeners
  - KAFKA_CFG_LISTENERS=SASL_SSL://:9092,CONTROLLER://:9093
  - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
  - KAFKA_CFG_ADVERTISED_LISTENERS=SASL_SSL://:9092
  - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
  - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=SASL_SSL
  - KAFKA_CLIENT_LISTENER_NAME=SASL_SSL # Remove this line if consumer/producer.properties are not required
  # SASL
  - KAFKA_CFG_SASL_MECHANISM_CONTROLLER_PROTOCOL=PLAIN
  - KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL=PLAIN
  - KAFKA_CONTROLLER_USER=controller_user
  - KAFKA_CONTROLLER_PASSWORD=controller_password
  - KAFKA_INTER_BROKER_USER=interbroker_user
  - KAFKA_INTER_BROKER_PASSWORD=interbroker_password
  - KAFKA_CLIENT_USERS=user
  - KAFKA_CLIENT_PASSWORDS=password
  # SSL
  - KAFKA_TLS_TYPE=JKS # or PEM
  - KAFKA_CERTIFICATE_PASSWORD=certificatePassword123
volumes:
  # Both .jks and .pem files are supported
  # - './kafka.keystore.pem:/opt/bit

Note: the README for this container is longer than the DockerHub length limit of 25000, so it has been trimmed. The full README can be found at https://github.com/bitnami/containers/blob/main/bitnami/kafka/README.md

作者:Jeebiz  创建时间:2025-04-24 18:24
最后编辑:Jeebiz  更新时间:2025-04-24 19:00