apache/kafkaApache Kafka is an open-source event streaming platform used to collect, process, store, and integrate data at scale in real time. It powers numerous use cases including stream processing, data integration, and pub/sub messaging.
Kafka was originally developed at LinkedIn, was open sourced in 2011, and became an Apache Software Foundation project in 2012. It is used by thousands of organizations globally to power mission-critical real-time applications, from stock exchanges, to e-commerce applications, to IoT monitoring & analytics, to name a few.
Start a Kafka broker:
consoledocker run -d --name broker apache/kafka:latest
Open a shell in the broker container:
consoledocker exec --workdir /opt/kafka/bin/ -it broker sh
A topic is a logical grouping of events in Kafka. From inside the container, create a topic called test-topic:
console./kafka-topics.sh --bootstrap-server localhost:9092 --create --topic test-topic
Write two string events into the test-topic topic using the console producer that ships with Kafka:
console./kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test-topic
This command will wait for input at a > prompt. Enter hello, press Enter, then world, and press Enter again. Enter Ctrl+C to exit the console producer.
Now read the events in the test-topic topic from the beginning of the log:
console./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --from-beginning
You will see the two strings that you previously produced:
hello world
The consumer will continue to run until you exit out of it by entering Ctrl+C.
When you are finished, stop and remove the container by running the following command on your host machine:
consoledocker rm -f broker
Apache Kafka supports a broad set of broker configurations that you may override via environment variables. The environment variables must begin with KAFKA_, and any dots in broker configurations should be specified as underscores in the corresponding environment variable. For example, to set the default number of partitions in topics, num.partitions, set the environment variable KAFKA_NUM_PARTITIONS. See the Kafka Docker Image Usage Guide for more information on overriding broker configuration in Docker.
It's important to note that if you are overriding any configuration, then none of the default configurations will be used. For example, to run Kafka in KRaft combined mode (meaning that the broker handling client requests and the controller handling cluster coordination both run in the same container) and set the default number of topic partitions to 3 instead of the default 1, we would specify KAFKA_NUM_PARTITIONS in addition to other required configurations:
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
Specifying this many environment variables on the command line gets cumbersome. It's simpler to instead use Docker Compose to specify and manage Kafka in Docker. Depending on how you installed Docker, you may already have Docker Compose. You can verify that it's available by checking if this command succeeds, and refer to the Docker Compose installation documentation here if it doesn't:
consoledocker compose version
To run Kafka with Docker Compose and override the default number of topic partitions to be 3, first copy the following into a file named 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
Now, from the directory containing this file, bring Kafka up in detached mode so that the containers run in the background:
consoledocker compose up -d
The above quick start steps will work if you'd like to test topic creation and producing / consuming messages.
When you are finished, stop and remove the container by running the following command on your host machine from the directory containing the docker-compose.yml file:
consoledocker compose down
The examples up to this point run Kafka client commands from within Docker. In order to run clients from outside Docker, two additional steps are needed when running one container in combined mode (it gets a little more complicated in the next section on multiple brokers).
First, map the port that Kafka listens on to the same port on your host machine, either by passing -p 9092:9092 to the docker run command:
consoledocker run -d -p 9092:9092 --name broker apache/kafka:latest
Or, if using Docker Compose, add the port mapping to the broker container spec:
yamlports: - 9092:9092
Second, download and unzip the latest Kafka release. The console producer and consumer CLI tools are included in the unzipped distribution's bin directory. The above quick start steps will work from your host machine; it's just that localhost refers to your host machine as opposed to the within-container localhost.
In this section, you will explore a more re***ic Kafka deployment consisting of three brokers and three controllers running in their own containers (i.e., KRaft isolated mode). We'll also configure it such that we can connect to Kafka from within Docker or from the host machine. Bear in mind that doing this exercise in Docker is convenient to learn about multi-broker configurations and the Kafka protocol, but this Docker Compose example isn't appropriate for a production deployment.
Compared to a single-node Kafka deployment, there is a bit more to do on the configuration front:
KAFKA_PROCESS_ROLES is either broker or controller depending on the container's role, not the KRaft combined mode value broker,controllerKAFKA_CONTROLLER_QUORUM_VOTERS is a comma-separated list of the three controllersKAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR (3), KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR (3), and KAFKA_TRANSACTION_STATE_LOG_MIN_ISR (2) now that there are enough brokers to support the default settings, so we don't specify these configurations (a partition's replicas must reside on different brokers for fault tolerance)localhost on a unique port that gets mapped on the host (29092 for broker-1, 39092 for broker-2, and 49092 for broker-3). With one node, a single listener on localhost works because the localhost name is conveniently correct from within the container and from the host machine, but this doesn't apply in a multi-node setup.To deploy this six-node setup on your machine, copy the following into a file named 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
Start the containers from the directory containing the docker-compose.yml file:
consoledocker compose up -d
Now, the following commands will work to produce and consume from within the Docker network. First, open a shell on any of the nodes:
consoledocker exec --workdir /opt/kafka/bin/ -it broker-1 sh
Now run these commands in the container shell to create a topic, produce to it, and consume from it:
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
Alternatively, you can run the client programs from your host machine by navigating to your Kafka distribution's bin directory and running:
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
When you are finished, stop and remove the Kafka deployment by running the following command on your host machine from the directory containing the docker-compose.yml file:
consoledocker compose down
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
在 Linux 系统配置镜像服务
在 Docker Desktop 配置镜像
Docker Compose 项目配置
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
在宝塔面板一键配置镜像
Synology 群晖 NAS 配置
飞牛 fnOS 系统配置镜像
极空间 NAS 系统配置服务
爱快 iKuai 路由系统配置
绿联 NAS 系统配置镜像
QNAP 威联通 NAS 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
无需登录使用专属域名
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
免费版仅支持 Docker Hub 访问,不承诺可用性和速度;专业版支持更多镜像源,保证可用性和稳定速度,提供优先客服响应。
专业版支持 docker.io、gcr.io、ghcr.io、registry.k8s.io、nvcr.io、quay.io、mcr.microsoft.com、docker.elastic.co 等;免费版仅支持 docker.io。
当返回 402 Payment Required 错误时,表示流量已耗尽,需要充值流量包以恢复服务。
通常由 Docker 版本过低导致,需要升级到 20.x 或更高版本以支持 V2 协议。
先检查 Docker 版本,版本过低则升级;版本正常则验证镜像信息是否正确。
使用 docker tag 命令为镜像打上新标签,去掉域名前缀,使镜像名称更简洁。
来自真实用户的反馈,见证轩辕镜像的优质服务