使用Docker运行Apache Kafka

Ref Guide to Setting Up Apache Kafka Using Docker

前言#

在软件领域,Docker是创建、打包、部署应用的最受欢迎的容器引擎之一。本教程我们会学习如何使用Docker运行Kafka。

单实例模式#

在本地开发,单个Kafka broker更简单方便。

docker-compose.yml 配置#

为了启动一个kafka broker,需要先启动一个Zookeeper服务。 我们在docker-compose.yml文件中配置这个依赖, 这样保证在启动Kafka服务之前确保Zookeeper服务已经启动。

下面创建一个简单的docker-compose.yml文件,包含两个服务,命名为 zookeeperkafka

docker-compose.yml
version: '2'
services:
zookeeper:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 22181:2181
kafka:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper
ports:
- 29092:29092
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

在上面的配置中,对于同容器的kafka服务,zookeeper服务暴露的的是2181端口号。而对于运行在主机上的其他客户端,kafka暴露的是22181端口号。

类似的kafka通过端口号29092暴露给主机应用,但是在容器环境中使用KAFKA_ADVERTISED_LISTENERS配置项使用的是9092端口号。

启动Kafka服务#

下面使用 docker-compose 命令启动kafka服务:

docker-compose up -d

然后使用nc命令验证两个服务监听了预期的端口号:

nc -z localhost 22181
nc -z localhost 29092

也可以通过查看kafka启动日志查看是否运行了:

docker-compose logs kafka | grep -i started

现在kafka服务就绪可以使用了。

使用Kafka Tool连接Kafka#

可以使用Kafka Tool GUI 客户端工具建立和Kafka服务的连接.

Kafka集群设置#

下面通过扩展 docker-compose.yml 文件创建配置多节点Kafka集群。

docker-compose.yml 配置#

下面配置多个Zookeeper和Kafka服务:

docker-compose.yml
version: '2'
services:
zookeeper-1:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 22181:2181
zookeeper-2:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 32181:2181
kafka-1:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper-1
- zookeeper-2
ports:
- 29092:29092
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-1:9092,PLAINTEXT_HOST://localhost:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
kafka-2:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper-1
- zookeeper-2
ports:
- 39092:39092
environment:
KAFKA_BROKER_ID: 2
KAFKA_ZOOKEEPER_CONNECT: zookeeper-1:2181,zookeeper-2:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-2:9092,PLAINTEXT_HOST://localhost:39092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1

服务名称和 KAFKA_BROKER_ID 必须是唯一的。每个服务必须暴露出一个唯一的端口号给主机。