Docker 构建 Kafka 环境

1. 下载镜像

1. kafka 依赖 zookeeper ,需要先拉取 zookeeper 镜像

1
2
# 下载 zookeeper 镜像
$ docker pull wurstmeister/zookeeper

2. 拉取 kafka 镜像

1
2
# kafka 没有官方镜像,所以选择下载 kafka 镜像
$ docker pull wurstmeister/kafka

2. 生成容器并启动

1. 启动 zookeeper

1
$ docker run -d --name zookeeper -p 2081:2181 -t wurstmeister/zookeeper

2. 启动 kafka

1
2
3
4
5
6
7
$ docker run -d --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 --name kafka -p 9092:9092 --link zookeeper --env KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 --env KAFKA_ADVERTISED_HOST_NAME=localhost --env KAFKA_ADVERTISED_PORT=9092 -v /etc/localtime:/etc/localtime wurstmeister/kafka:latest

# 参数说明:
-e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 配置zookeeper管理kafka的路径
-e KAFKA_ADVERTISED_HOST_NAME:配置外部访问IP值
-e KAFKA_ADVERTISED_PORT:配置外部访问端口,即 HOST_NAME:PORT,即可访问容器内的kafka服务
-v /etc/localtime:/etc/localtime:容器时间同步虚拟机的时间

3. 测试发送消息

1. 创建主题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 进入 kafka 容器
$ docker exec -it kafka /bin/bash

# 进入到文件夹
bash-4.4# cd opt/kafka

# 创建一个名为“mykafka”的 topic
bash-4.4# ./bin/kafka-topics.sh --create --zookeeper 172.17.0.2:2181 --replication-factor 1 --partitions 1 --topic mykafka

# 参数说明:
--zookeeper 172.17.0.2:2181:IP需要提前知道
--replication-factor:指定副本数
--partitions:指定分区数,这个参数需要根据 broker 数和数据量决定,正常情况下,每个broker上两个partition最好
--topic:指定topic名字

# 查看所有 topic
bash-4.4# ./bin/kafka-topics.sh --list --zookeeper 172.17.0.2:2181

2. 运行一个生产者,指定 topic 为刚刚创建的 topic:

1
2
3
4
5
6
bash-4.4# ./bin/kafka-console-producer.sh --broker-list 172.17.0.3:9092 --topic mykafka
> Created topic mykafka.

# 参数说明:
--broker-list:kafka集群中的一个或者多个服务器的IP列表
--topic:指定 topic

3. 新开一个ssh,进入相同目录,运行一个消费者,指定同样的主题:

1
2
3
4
5
6
bash-4.4# ./bin/kafka-console-consumer.sh --bootstrap-server 172.17.0.3:9092 --topic mykafka --from-beginning

# 参数说明:
--bootstrap-server:目标集群的服务器地址
--topic:指定 topic 名称
--from-beginning:设置消息起始位置开始消费。默认是从新位置 latest开始消费

注意

  1. 查看 kafka版本
    1
    2
    # 进入到 kafka 安装目录,如下命令,前者是 Scala 版本,后者是 kafka 版本
    $ find ./libs/ -name \*kafka_\* | head -1 | grep -o '\kafka[^\n]*'