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 Name 或 FQDN 值设置为 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 19:00