我在本地的Docker环境中轻松运行了Kafka。第一部分
总结
被卡夫卡吸引住了,于是一个只了解基础设施的软件工程师购买了一台新的MacBookPro,在参考了诸位前辈在Qiita等网站上上传的文章后,将检验运行的步骤分成了7个部分记录了下来。
关于卡夫卡的概述,请参考这篇文章。
执行环境 (shí
macOS Big Sur 11.1
Docker版本20.10.2,构建2291f61
Python 3.8.3
网络的定义
首先,我们要定义用于本项目的网络。
当然,所有容器都应在一个单独的段上运行。
$ docker network create iot_network
7a00a485b89f83d664fef537f21e7df16ba34f14dc2731bc8686d2b0c55c1fe3
Docker Compose 文件
以下是定义了zookeeper、broker和cli容器的docker-compose.yml文件。
同时也定义了使用的网络(在上述文件中创建的网络)。
version: "3"
services:
zookeeper:
image: confluentinc/cp-zookeeper:5.5.1
hostname: zookeeper
container_name: zookeeper
ports:
- "32181:32181"
environment:
ZOOKEEPER_CLIENT_PORT: 32181
ZOOKEEPER_TICK_TIME: 2000
broker:
image: confluentinc/cp-kafka:5.5.1
hostname: broker
container_name: broker
depends_on:
- zookeeper
ports:
- "9092:9092"
- "29092:29092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: "zookeeper:32181"
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:29092,PLAINTEXT_HOST://localhost:9092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
CONFLUENT_SUPPORT_METRICS_ENABLE: "false"
cli:
image: confluentinc/cp-kafka:5.5.1
hostname: cli
container_name: cli
depends_on:
- broker
entrypoint: /bin/sh
tty: true
networks:
default:
external:
name: iot_network
创建和确认容器
构建并启动定义的容器。
$ docker-compose up -d
前略
Creating zookeeper ... done
Creating broker ... done
Creating cli ... done
检查正在运行的容器。
$ docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------------------------------
broker /etc/confluent/docker/run Up 0.0.0.0:29092->29092/tcp, 0.0.0.0:9092->9092/tcp
cli /bin/sh Up 9092/tcp
zookeeper /etc/confluent/docker/run Up 2181/tcp, 2888/tcp, 0.0.0.0:32181->32181/tcp, 3888/tcp
网络信息的确认
确认各容器所分配的网络信息。
容器之间的通信是通过容器名称进行的,无需关注IP地址。
$ docker network inspect iot_network
[
{
"Name": "iot_network",
"Id": "7a00a485b89f83d664fef537f21e7df16ba34f14dc2731bc8686d2b0c55c1fe3",
"Created": "2021-02-03T15:58:22.6410234Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.21.0.0/16",
"Gateway": "172.21.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"192c2091a0cbad678edfd6165b8392be9e6e17b7b4eb74179303c366d6efa301": {
"Name": "broker",
"EndpointID": "ace1688ef02c686264325019143afef994078e53501586ebf7859c4a5b8b4ef9",
"MacAddress": "02:42:ac:15:00:03",
"IPv4Address": "172.21.0.3/16",
"IPv6Address": ""
},
"79634a9c332300d558235170e19f9ede4528d4566c95eceaf0adc31b1ab9e441": {
"Name": "zookeeper",
"EndpointID": "fcdcd02386f9f972d6a93e8d7b2820f3df8039f0749ff2c9981ca3e7754322f0",
"MacAddress": "02:42:ac:15:00:02",
"IPv4Address": "172.21.0.2/16",
"IPv6Address": ""
},
"dd58a95c5904c456e728e9fd881b50e89b1138a23424378cedde87d86c95bba0": {
"Name": "cli",
"EndpointID": "690e00daf32594623a0068a86fbbe5be90a53f42f1901606d59f035ff6c43b1c",
"MacAddress": "02:42:ac:15:00:04",
"IPv4Address": "172.21.0.4/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
我已经在本地Docker环境中确认了Kafka基本组件的运行。
关于下一次
下一次(第2次)将由制片人发送信息,并由消费者确认接收该信息。
第1回:在本地Docker环境下运行Kafka基本组件
第2回:确认通过Kafka的Producer将消息经过Broker传递给Consumer成功接收
第3回:确认通过Producer上的Python程序生成的数据经过Broker传递给Consumer成功接收
第4回:确认Producer上生成的数据通过topic-01经过KSQL(topic01_stream1 → topic01_stream2)进行流式抽取处理成功
第5回:确认Producer上生成的数据通过topic-01 → Ksql → topic-11经过Consumer上的Python程序成功接收
第6回:确认Producer上生成的数据通过topic-01 → Ksql → topic-11经过Consumer上的Python程序成功写入到S3
第7回:确认通过两个Producer容器生成的各自数据通过topic-01 → Ksql → topic-11经过Consumer上的Python程序成功接收
参考信息
我参考了以下信息。非常感谢。
Kafka的Docker教程
利用Docker简单构建Kafka到KSQL的环境