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文件,包含两个服务,命名为 zookeeper 和 kafka:
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 必须是唯一的。每个服务必须暴露出一个唯一的端口号给主机。