Docker 搭建 Kafka 单机开发环境

前言

本文主要介绍如何在本地使用 Docker 搭建 Kafka 的单机开发环境,其中包括 ZooKeeper,Kafka,Kafka-UI 的安装。

提示

  • Kafka 的 Broker 组件是使用 Scala 开发的,而 Producer 组件和 Consumer 组件是使用 Java 开发的。
  • Kafka 第三方的开源可视化管理工具有很多种,主流的有 Kafka-UI、Kafka Manager(CMAK)、Kafka Eagle(EFAK),详细的对比介绍请看 这里

版本说明

软件版本说明
Zookeeper3.7
Kafka3.6.0
Kafka-UIlatest

Docker 安装

在本节中,将介绍 CentOS 7 如何安装 Docker。若使用的 Linux 系统是其他发行版,建议网上搜索对应的安装教程,这里不再累述。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 卸载旧版本的 Docker
# yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

# 添加 YUM 仓库
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装 Docker
# yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 开机启动 Docker
# systemctl enable docker

# 启动 Docker
# systemctl start docker

# 查看运行状态
# systemctl status docker

创建数据目录

在宿主机内创建 Zookeeper 的数据目录,用于持久化 Zookeeper 容器内的数据。

1
2
3
4
5
# 创建目录
mkdir -p /data/zookeeper/

# 文件授权
chmod -R 777 /data/zookeeper/

在宿主机内创建 Kafka 的数据目录,用于持久化 Kafka 容器内的数据。

1
2
3
4
5
# 创建目录
mkdir -p /data/kafka/

# 文件授权
chmod -R 777 /data/kafka/

创建配置文件

在宿主机的任意目录下创建 docker-compose.yml 配置文件,用于 Docker Compose 管理容器,可以根据实际需求适当更改 Zookeeper、Kafka 镜像的版本号。值得一提的是,这里使用 Vmware 旗下的 Bitnami 平台维护的 Zookeeper、Kafka 镜像,而 Kafka-UI 则使用 Provectuslabs 维护的镜像,这样比较稳定可靠。

特别注意

在下述的 KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://192.168.1.130:9092 配置中,192.168.1.130 是宿主机的 IP 地址,请自行更改为您宿主机的 IP。如果配置错误,会导致外部 Kafka 客户端无法正常连接 Docker 容器内的 Kafka 服务器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
version: '3.9'

services:
zookeeper:
image: bitnami/zookeeper:3.7
container_name: zookeeper
restart: always
environment:
TZ: "Asia/Shanghai"
ALLOW_ANONYMOUS_LOGIN: yes
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
volumes:
- /data/zookeeper:/bitnami/zookeeper
networks:
- docker-kafka

kafka:
image: bitnami/kafka:3.6.0
container_name: kafka
restart: always
ports:
- "9092:9092"
environment:
TZ: "Asia/Shanghai"
KAFKA_CFG_NODE_ID: 0
KAFKA_CFG_LISTENERS: PLAINTEXT://:9092
KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://192.168.1.130:9092
KAFKA_CFG_ZOOKEEPER_CONNECT: zookeeper:2181
ALLOW_PLAINTEXT_LISTENER: yes
volumes:
- /data/kafka:/bitnami/kafka
networks:
- docker-kafka
depends_on:
- zookeeper

kafka-ui:
image: provectuslabs/kafka-ui:v0.7.1
container_name: kafka-ui
restart: always
ports:
- "9095:8080"
environment:
TZ: "Asia/Shanghai"
KAFKA_CLUSTERS_0_NAME: dev
KAFKA_CLUSTERS_0_ZOOKEEPER: zookeeper:2181
KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka:9092
networks:
- docker-kafka
depends_on:
- kafka

networks:
docker-kafka:
driver: bridge

提示

  • 在上述配置中,可以直接使用在 Docker-Compose 配置文件中定义的服务名称来替代容器的 IP 地址。
  • 从 Kafka 2.8.0 版本开始,Kafka 自身实现了 Raft 分布式一致性机制,这意味着 Kafka 集群是可以选择脱离 ZooKeeper 独立运行的。

启动 Docker 容器

1
2
3
4
5
# 创建并启动容器
docker compose up -d

# 查看容器的运行状态
docker compose ps -a

测试 Docker 容器

若可以使用以下地址访问对应的应用,则说明对应的 Docker 容器正常运行。值得一提的是,192.168.1.130 是宿主机的 IP 地址,请自行更改为您宿主机的 IP。

应用访问地址说明
Zookeeper192.168.1.130:2181
Kafka192.168.1.130:9092
Kafka-UIhttp://192.168.1.130:9095浏览器可以直接访问

Kafka 基础操作

内部操作

值得一提的是,以下操作虽然是在宿主机上执行,但其本质是在 Docker 容器内部执行。

创建 Topic

1
docker exec kafka kafka-topics.sh --create --topic first-topic --partitions 1 --replication-factor 1 --bootstrap-server kafka:9092

启动消费者(接收消息)

1
docker exec kafka kafka-console-consumer.sh --topic first-topic --from-beginning --bootstrap-server kafka:9092

启动生产者(发送消息)

1
docker exec -it kafka kafka-console-producer.sh --topic first-topic --broker-list kafka:9092

提示

启动生产者后,等待终端出现 > 符号,然后输入消息内容,并按下 回车键,这样就可以将消息发送给消费者了。

外部操作

值得一提的是,以下操作是在 Docker 容器外部执行,可以是在宿主机或者其他机器上执行。** 特别注意,其中的 192.168.1.130 是宿主机的 IP 地址,请自行更改为您宿主机的 IP。**

创建 Topic

1
./kafka-topics.sh --create --topic first-topic --partitions 1 --replication-factor 1 --bootstrap-server 192.168.1.130:9092

启动消费者(接收消息)

1
./kafka-console-consumer.sh --topic first-topic --from-beginning --bootstrap-server 192.168.1.130:9092

启动生产者(发送消息)

1
./kafka-console-producer.sh --topic first-topic --broker-list 192.168.1.130:9092

提示

启动生产者后,等待终端出现 > 符号,然后输入消息内容,并按下 回车键,这样就可以将消息发送给消费者了。

参考资料

Docker Hub 文档

Kafka 详细配置教程

Docker 部署 Kafka 教程