Apache Kafka 是一款开源事件流平台,用于实时大规模收集、处理、存储和集成数据。它支持多种应用场景,包括流处理、数据集成和发布/订阅消息传递。
Kafka 最初由 LinkedIn 开发,2011 年开源,2012 年成为 Apache 软件基金会项目。目前全球数千家组织使用它来支撑关键实时应用,例如证券交易系统、电商平台、物联网监控与分析等。
consoledocker run -d --name broker apache/kafka:latest
consoledocker exec --workdir /opt/kafka/bin/ -it broker sh
主题(topic)是 Kafka 中事件的逻辑分组。从容器内创建名为 test-topic 的主题:
console./kafka-topics.sh --bootstrap-server localhost:9092 --create --topic test-topic
使用 Kafka 自带的控制台生产者向 test-topic 写入两条字符串事件:
console./kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test-topic
命令执行后会显示 > 提示符,输入 hello 并按回车,再输入 world 按回车,最后按 Ctrl+C 退出生产者。
从日志开头读取 test-topic 中的事件:
console./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --from-beginning
会看到之前生产的两条消息:
hello world
消费者会持续运行,按 Ctrl+C 退出。
完成后,在主机执行以下命令停止并删除容器:
consoledocker rm -f broker
Kafka 支持通过环境变量覆盖大量 broker 配置。环境变量需以 KAFKA_ 开头,配置项中的点(.)需替换为下划线(_)。例如,要设置主题默认分区数 num.partitions,需定义环境变量 KAFKA_NUM_PARTITIONS。更多配置说明见 Kafka Docker 镜像使用指南。
注意:覆盖任何配置后,默认配置将不再生效。例如,以 KRaft combined 模式(broker 和 controller 在同一容器中运行)启动 Kafka,并将默认分区数设为 3(默认是 1),需指定以下环境变量:
consoledocker run -d \ --name broker \ -e KAFKA_NODE_ID=1 \ -e KAFKA_PROCESS_ROLES=broker,controller \ -e KAFKA_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \ -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \ -e KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER \ -e KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT \ -e KAFKA_CONTROLLER_QUORUM_VOTERS=1@localhost:9093 \ -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \ -e KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR=1 \ -e KAFKA_TRANSACTION_STATE_LOG_MIN_ISR=1 \ -e KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS=0 \ -e KAFKA_NUM_PARTITIONS=3 \ apache/kafka:latest
命令行指定大量环境变量较繁琐,建议使用 Docker Compose 管理。先检查 Docker Compose 是否安装:
consoledocker compose version
未安装可参考 安装文档。
docker-compose.yml 文件,内容如下:yamlservices: 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
consoledocker compose up -d
可按 快速入门 步骤测试主题创建、消息生产与消费。
停止服务:
consoledocker compose down
前面的示例在 Docker 容器内运行客户端命令。从外部连接需额外两步(单节点 combined 模式下):
docker run:添加 -p 9092:9092 映射端口:
consoledocker run -d -p 9092:9092 --name broker apache/kafka:latest
broker 服务中添加端口映射:
yamlports: - 9092:9092
从 最新 Kafka 版本 下载并解压,控制台生产者/消费者工具位于 bin 目录。此时 快速入门 步骤可在主机执行,localhost 指向主机而非容器内地址。
本节部署更接近实际场景的多节点集群:3 个 broker 和 3 个 controller(KRaft isolated 模式),支持 Docker 内和主机连接。注意:此示例仅用于学***,不适合生产环境。
KAFKA_PROCESS_ROLES 按角色设为 broker 或 controller(非 combined 模式的 broker,controller)。KAFKA_CONTROLLER_QUORUM_VOTERS 列出 3 个 controller。offsets.topic.replication.factor=3)可满足多节点场景,无需额外指定。docker-compose.yml 文件:yamlservices: controller-1: image: apache/kafka:latest container_name: controller-1 environment: KAFKA_NODE_ID: 1 KAFKA_PROCESS_ROLES: controller KAFKA_LISTENERS: CONTROLLER://:9093 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_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 controller-2: image: apache/kafka:latest container_name: controller-2 environment: KAFKA_NODE_ID: 2 KAFKA_PROCESS_ROLES: controller KAFKA_LISTENERS: CONTROLLER://:9093 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_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 controller-3: image: apache/kafka:latest container_name: controller-3 environment: KAFKA_NODE_ID: 3 KAFKA_PROCESS_ROLES: controller KAFKA_LISTENERS: CONTROLLER://:9093 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_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 broker-1: image: apache/kafka:latest container_name: broker-1 ports: - 29092:9092 environment: KAFKA_NODE_ID: 4 KAFKA_PROCESS_ROLES: broker KAFKA_LISTENERS: 'PLAINTEXT://:***,PLAINTEXT_HOST://:9092' KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://broker-1:***,PLAINTEXT_HOST://localhost:29092' KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093 KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 depends_on: - controller-1 - controller-2 - controller-3 broker-2: image: apache/kafka:latest container_name: broker-2 ports: - 39092:9092 environment: KAFKA_NODE_ID: 5 KAFKA_PROCESS_ROLES: broker KAFKA_LISTENERS: 'PLAINTEXT://:***,PLAINTEXT_HOST://:9092' KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://broker-2:***,PLAINTEXT_HOST://localhost:39092' KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093 KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 depends_on: - controller-1 - controller-2 - controller-3 broker-3: image: apache/kafka:latest container_name: broker-3 ports: - 49092:9092 environment: KAFKA_NODE_ID: 6 KAFKA_PROCESS_ROLES: broker KAFKA_LISTENERS: 'PLAINTEXT://:***,PLAINTEXT_HOST://:9092' KAFKA_ADVERTISED_LISTENERS: 'PLAINTEXT://broker-3:***,PLAINTEXT_HOST://localhost:49092' KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_CONTROLLER_QUORUM_VOTERS: 1@controller-1:9093,2@controller-2:9093,3@controller-3:9093 KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 depends_on: - controller-1 - controller-2 - controller-3
consoledocker compose up -d
进入任一 broker 容器:
consoledocker exec --workdir /opt/kafka/bin/ -it broker-1 sh
执行以下命令创建主题、生产/消费消息:
console./kafka-topics.sh --bootstrap-server broker-1:***,broker-2:***,broker-3:*** --create --topic test-topic
console./kafka-console-consumer.sh --bootstrap-server broker-1:***,broker-2:***,broker-3:*** --topic test-topic --from-beginning
console./kafka-console-producer.sh --bootstrap-server broker-1:***,broker-2:***,broker-3:*** --topic test-topic
进入 Kafka 发行版的 bin 目录,执行:
console./kafka-topics.sh --bootstrap-server localhost:29092,localhost:39092,localhost:49092 --create --topic test-topic2
console./kafka-console-producer.sh --bootstrap-server localhost:29092,localhost:39092,localhost:49092 --topic test-topic2
console./kafka-console-consumer.sh --bootstrap-server localhost:29092,localhost:39092,localhost:49092 --topic test-topic2 --from-beginning
consoledocker compose down
来自真实用户的反馈,见证轩辕镜像的优质服务
免费版仅支持 Docker Hub 加速,不承诺可用性和速度;专业版支持更多镜像源,保证可用性和稳定速度,提供优先客服响应。
免费版仅支持 docker.io;专业版支持 docker.io、gcr.io、ghcr.io、registry.k8s.io、nvcr.io、quay.io、mcr.microsoft.com、docker.elastic.co 等。
当返回 402 Payment Required 错误时,表示流量已耗尽,需要充值流量包以恢复服务。
通常由 Docker 版本过低导致,需要升级到 20.x 或更高版本以支持 V2 协议。
先检查 Docker 版本,版本过低则升级;版本正常则验证镜像信息是否正确。
使用 docker tag 命令为镜像打上新标签,去掉域名前缀,使镜像名称更简洁。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
在 Linux 系统配置镜像加速服务
在 Docker Desktop 配置镜像加速
Docker Compose 项目配置加速
Kubernetes 集群配置 Containerd
在宝塔面板一键配置镜像加速
Synology 群晖 NAS 配置加速
飞牛 fnOS 系统配置镜像加速
极空间 NAS 系统配置加速服务
爱快 iKuai 路由系统配置加速
绿联 NAS 系统配置镜像加速
QNAP 威联通 NAS 配置加速
Podman 容器引擎配置加速
HPC 科学计算容器配置加速
ghcr、Quay、nvcr 等镜像仓库
无需登录使用专属域名加速
需要其他帮助?请查看我们的 常见问题 或 官方QQ群: 13763429