我在本地的Docker环境中轻松运行了Kafka。第一部分

总结

被卡夫卡吸引住了,于是一个只了解基础设施的软件工程师购买了一台新的MacBookPro,在参考了诸位前辈在Qiita等网站上上传的文章后,将检验运行的步骤分成了7个部分记录了下来。
关于卡夫卡的概述,请参考这篇文章。

kafka-00.png
kafka-1.png

执行环境 (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的环境

广告
将在 10 秒后关闭
bannerAds