【云原生】Docker 搭建Kafka服務兩種方式實戰操作詳解

目錄

一、前言

二、Docker 搭建kafka介紹

2.1 Docker 命令部署

2.2 使用Docker Compose 部署

2.3 使用 Docker Swarm

2.4 使用 Kubernetes

2.5 部署建議

三、Docker 搭建kafka操作方式一

3.1 前置準備

3.2 完整操作過程

3.2.1 創建docker網絡

3.2.2 啟動zookeeper容器

3.3 啟動kafka容器

3.4 效果測試與驗證

四、Docker 搭建kafka操作方式二

4.1 前置說明

4.2 KRaft 模式部署kafka操作過程

4.2.1 前置準備

4.2.2 獲取鏡像

4.2.3 創建數據目錄

4.2.4 啟動 Kafka Broker

4.2.5 驗證生產消費是否可用

五、寫在文末


一、前言

kafka作為一款性能強勁且經過各類大型項目考驗過的消息中間件,在全世界的知名度和認可度非常高,也是很多處理高并發、大數據量場景下的首選。隨著Docker容器化的發展越加成熟,基于Docker部署各類中間件時間成本越越來越低,本文介紹下基于Docker部署kafka的兩種操作方式。

二、Docker 搭建kafka介紹

Docker 是一個開源的應用容器引擎,讓開發者可以打包、分發和運行應用程序在任何環境上。使用 Docker 部署 Kafka 可以簡化配置和管理,特別是在需要快速搭建開發和測試環境時非常有用。下面介紹幾種 Docker 搭建 Kafka 的一些常用方案及其與傳統部署方式的對比。

2.1 Docker 命令部署

使用純粹的 Docker 命令(docker run)來部署 Kafka。這種方式更直接,便于理解容器運行的細節,也非常適合快速啟動單個容器進行測試。這種方式通常需要搭配zookeeper一起部署使用。

2.2 使用Docker Compose 部署

這是最簡單、最快速的啟動方式,通過一個 YAML 文件定義和運行多個容器(ZooKeeper 和 Kafka)。參考下面的示例。

優點:一鍵部署、配置即代碼、易于版本控制和分享。

缺點:單機部署,無法充分利用 Docker Swarm 或 Kubernetes 的集群能力。

version: '3.8'
services:zookeeper:image: confluentinc/cp-zookeeper:7.4.0hostname: zookeepercontainer_name: zookeeperports:- "2181:2181"environment:ZOOKEEPER_CLIENT_PORT: 2181ZOOKEEPER_TICK_TIME: 2000volumes:- ./zk-data:/var/lib/zookeeper/data- ./zk-logs:/var/lib/zookeeper/logkafka:image: confluentinc/cp-kafka:7.4.0hostname: kafkacontainer_name: kafkadepends_on:- zookeeperports:- "9092:9092"- "29092:29092" # 用于容器內網絡訪問的監聽器environment:KAFKA_BROKER_ID: 1KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT# 外部客戶端(宿主機或其他機器)通過這個地址連接KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true"KAFKA_PROCESS_ROLES: "broker"KAFKA_CONTROLLER_LISTENER_NAMES: "CONTROLLER"volumes:- ./kafka-data:/var/lib/kafka/data

2.3 使用 Docker Swarm

這種方式適用于簡單的集群部署,Docker Compose 的集群模式版本。它可以在一組主機上部署服務,并提供簡單的服務發現和負載均衡。特點:

  • 使用 docker stack deploy -c docker-compose.yml kafka_stack 命令部署。

  • 需要配置共享存儲(如 NFS、Ceph)以便所有 Swarm 節點都能訪問 Kafka 和 ZooKeeper 的數據卷,復雜度較高。

  • 對于有狀態且需要穩定網絡標識的服務 like Kafka,Swarm 的管理不如 Kubernetes 成熟。

2.4 使用 Kubernetes

這是部署生產級、高可用 Kafka 集群最強大和最推薦的方式。

  • Operator 模式:這是最主流的方式。Operator 是一種自定義 Kubernetes 控制器,它封裝了管理 Kafka 集群的專業知識(如部署、配置、擴縮容、升級、故障轉移)。

    • Strimzi Operator:目前最流行、功能最全面的 Kafka Kubernetes Operator。它提供了極其豐富的 CRD(自定義資源)來定義 Kafka 集群、Topic、用戶等。

    • Confluent Operator:Confluent 公司官方提供的 Operator,與 Confluent 平臺的其他組件(如 Connect、Schema Registry)集成更好,但部分高級功能需要商業許可。

2.5 部署建議

  • 開發與測試環境:強烈推薦使用 Docker Compose。它是搭建本地和測試環境的事實標準,能極大提升效率。

  • 生產環境:

    • 如果追求敏捷、彈性、云原生,并且技術團隊具備相應能力,使用 Kubernetes + Strimzi Operator 是最佳選擇。

    • 如果對性能有極致要求,或者運維體系基于傳統物理機/虛擬機且非常穩定,傳統部署方式仍然是可靠的選擇。許多大規模互聯網公司依然采用物理機部署核心消息隊列集群。

最終,選擇哪種方式取決于你的團隊技術棧、業務需求和對運維模式的規劃。

三、Docker 搭建kafka操作方式一

3.1 前置準備

  • 服務器環境:Linux操作系統

  • 服務器配置:2核4G

  • Docker環境,提前安裝好Docker環境;

3.2 完整操作過程

搭配zookeeper進行使用,這個是部署kafka比較經典的方式,參考下面的完整操作過程。

3.2.1 創建docker網絡

為了更好的讓kafka與zookeeper交互,提前創建一個docker網絡

docker network create kafka-net

3.2.2 啟動zookeeper容器

使用下面的命令啟動zk容器

docker run -d \--name zookeeper_01 \--network kafka-net \-p 12179:2181 \-e ZOO_TICK_TIME=2000 \zookeeper:latest

參數解釋:

  • -d: 后臺運行容器。

  • --name: 為容器指定一個名稱。

  • --network: 加入創建的 kafka-net 網絡。

  • -p 12179:2181: 將容器的 12179端口映射到宿主機的 2181 端口。

  • -e ZOO_TICK_TIME=2000: 設置 ZooKeeper 的基本時間單位(毫秒)。

3.3 啟動kafka容器

使用下面的命令啟動kafka容器

docker run -d \
--name kafka_01 \
-p 19091:9092 \
-e KAFKA_BROKER_ID=0 \
-e KAFKA_ZOOKEEPER_CONNECT=服務器公網IP:12179 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://服務器公網IP:19091 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
wurstmeister/kafka:latest

docker 參數說明:

  • KAFKA_ADVERTISED_LISTENERS: 非常重要。Broker 發布給客戶端(生產者、消費者)的連接地址。如果客戶端在宿主機外,需替換 localhost 為宿主機 IP。

  • KAFKA_LISTENERS: Broker 實際監聽的地址和協議,0.0.0.0 表示監聽所有網絡接口。

  • KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 設置內部偏移量主題的副本因子,單機設為 1 即可。

3.4 效果測試與驗證

kafka的服務搭建完成之后,接下來驗證下是否可以先通過客戶端操作命令正常使用topic進行收發消息。

1)進入 Kafka 容器:

docker exec -it kafka_01 /bin/bash

2)創建一個topic

# 傳統模式
kafka-topics.sh --create --zookeeper 公網IP:12179 --replication-factor 1 --partitions 1 --topic test-topic

3)啟動生產者窗口

開啟一個生產者窗口,嘗試往上面的topic中發送消息

kafka-console-producer.sh --broker-list 公網IP:19091 --topic test-topic

看到下面的效果說明生產端連接上了

4)啟動消費者窗口

開啟一個新的消費者窗口,嘗試從上面的topic中接收消息

kafka-console-consumer.sh --bootstrap-server 公網IP:19091 --topic test-topic --from-beginning

看到下面的效果說明消費端接收消息就緒了

5)發送消息

接下來從生產者窗口發送一條消息,可以看到消息能夠正常的發送出去,同時消費端也能接收到消息

四、Docker 搭建kafka操作方式二

4.1 前置說明

基于Docker部署kafka目前有兩種主流的方式,一是使用ZooKeeper 的模式,另一種則是無需zk的KRaft 模式,兩種模式的區別如下:

特性傳統 ZooKeeper 模式KRaft 模式 (無需 ZooKeeper)
架構Kafka Broker 依賴外部的 ZooKeeper 集群進行元數據管理Kafka 使用內置的 Raft 協議進行元數據管理,無需額外組件
資源占用較高(需運行 ZooKeeper 容器)較低(只需運行 Kafka 容器)
復雜度相對較高(需管理兩個容器及它們之間的配置)相對較低(配置集中于單個容器)
推薦場景學習、測試兼容舊版本希望部署更簡單、資源占用更少的新版本環境

4.2 KRaft 模式部署kafka操作過程

接下來演示基于KRaft 模式部署kafka完整過程。

4.2.1 前置準備

確保你的系統已安裝 Docker。可以通過以下命令檢查:

docker --version

4.2.2 獲取鏡像

我們將使用廣泛認可的 wurstmeister/kafkazookeeper 鏡像(用于傳統模式)或 apache/kafka 鏡像(用于 KRaft 模式)。這里使用KRaft 的方式獲取安裝的鏡像(無需zookeeper)。

docker pull apache/kafka:3.9.0

4.2.3 創建數據目錄

可選,用于數據持久化

mkdir -p /data/kafka/data
mkdir -p /data/kafka/config
mkdir -p /data/kafka/secrets

4.2.4 啟動 Kafka Broker

使用下面的命令啟動kafka容器

# 運行容器
sudo docker run --privileged=true \
--net=bridge \
-d --name=kafka-kraft \
-v /data/kafka/data:/var/lib/kafka/data \
-v /data/kafka/config:/mnt/shared/config \
-v /data/kafka/secrets:/etc/kafka/secrets \
-p 9092:9092 -p 9093:9093 \
-e TZ=Asia/Shanghai \
-e LANG=C.UTF-8 \
-e KAFKA_NODE_ID=1 \
-e CLUSTER_ID=kafka-cluster \
-e KAFKA_PROCESS_ROLES=broker,controller \
-e KAFKA_INTER_BROKER_LISTENER_NAME=PLAINTEXT \
-e KAFKA_CONTROLLER_LISTENER_NAMES=CONTROLLER \
-e KAFKA_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://公網IP:9092 \
-e KAFKA_CONTROLLER_QUORUM_VOTERS=1@localhost:9093 \
apache/kafka:3.9.0

參數

參數說明

docker run

運行 Docker 容器

-d

容器將在后臺運行,而不是占用當前的終端會話

--privileged=true

Docker會賦予容器幾乎與宿主機相同的權限

--net=bridge

網絡模式配置,默認是bridge,bridge表示使用容器內部配置網絡

--name kafka-kraft

給容器命名為 kafka-kraft,以便于管理和引用該容器

-p 9092:9092 -p 9093:9093

映射 kafka 的客戶端通信端口和控制器端口

-e KAFKA_NODE_ID=1

節點ID,用于標識每個集群中的節點,需要是不小于1的整數,同一個集群中的節點ID不可重復

-e CLUSTER_ID=kafka-cluster

集群ID,可以自定義任何字符串作為集群ID,同一個集群中所有節點的集群ID必須配置為一樣

-e KAFKA_PROCESS_ROLES=broker,controller

節點類型,broker,controller表示該節點是混合節點,通常單機部署時需要配置為混合節點

-e KAFKA_INTER_BROKER_LISTENER_NAME=

PLAINTEXT

Kafka的Broker地址前綴名稱,固定為PLAINTEXT即可

-e KAFKA_CONTROLLER_LISTENER_NAMES=

CONTROLLER

Kafka的Controller地址前綴名稱,固定為CONTROLLER即可

-e KAFKA_LISTENERS=

PLAINTEXT://:9092,CONTROLLER://:9093

表示Kafka要監聽哪些端口,PLAINTEXT://:9092,CONTROLLER://:9093表示本節點作為混合節點,監聽本機所有可用網卡的9092和9093端口,其中9092作為客戶端通信端口,9093作為控制器端口

-e KAFKA_ADVERTISED_LISTENERS=

PLAINTEXT://192.168.3.9:9092

配置Kafka的外網地址,需要是PLAINTEXT://外網地址:端口的形式,當客戶端連接Kafka服務端時,Kafka會將這個外網地址廣播給客戶端,然后客戶端再通過這個外網地址連接,除此之外集群之間交換數據時也是通過這個配置項得到集群中每個節點的地址的,這樣集群中節點才能進行交互。需要修改為對應的Kafka的外網地址。

-e KAFKA_CONTROLLER_QUORUM_VOTERS=

1@localhost:9093

投票節點列表,通常配置為集群中所有的Controller節點,格式為節點id@節點外網地址:節點Controller端口,多個節點使用逗號,隔開,由于是混合節點,因此配置自己就行了

-v /data/docker/kafka-kraft/data:

/var/lib/kafka/data

持久化數據文件夾,如果運行出現問題可以清空該數據卷文件重啟再試

-v /data/docker/kafka-kraft/config:

/mnt/shared/config

持久化配置文件目錄

-v /data/docker/kafka-kraft/secrets:

/etc/kafka/secrets

持久化秘鑰相關文件夾

4.2.5 驗證生產消費是否可用

參考上面的方式,分別創建一個生產者和一個消費者,查看消費者是否能夠收到生產者生產的消息

# 1.進入kafka容器內
sudo docker exec -it kafka-kraft /bin/bash# 2.進入kafka安裝目錄
cd /opt/kafka/bin# 3、創建一個測試的topic
./kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test01 # 4、查詢主題列表
./kafka-topics.sh --bootstrap-server localhost:9092 --list# 5.生產消息
./kafka-console-producer.sh --topic test01 --bootstrap-server localhost:9092# 6.消費消息
./kafka-console-consumer.sh --topic test01 --from-beginning --bootstrap-server localhost:9092 --partition 0# 查詢消費組列表
./kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list

1)創建一個topic

2)查看topic 列表

3)開啟一個生產者窗口

發送2條消息

4)開啟一個消費者窗口

五、寫在文末

本文通過案例操作演示了基于Docker環境部署單節點kafka服務的完整操作過程,更多深入的點有興趣的同學可以基于研究,本篇到此介紹,感謝觀看。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/94836.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/94836.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/94836.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DBeaver中禁用PostgreSQL SSL的配置指南

在DBeaver中為PostgreSQL連接禁用SSL是一個常見的配置,特別是當你的數據庫服務器未啟用SSL或遇到連接問題時。我來為你詳細講解操作步驟和注意事項。 🛠? DBeaver中禁用PostgreSQL SSL的配置指南 詳細步驟 打開驅動設置:在DBeaver中創建新的…

數組去重【JavaScript】

數組去重,并且key和val相同的對象視為相同的,需要去重。主函數:/*** 數組去重* 兩個屬性相同的對象也認為是相同的* param {Array} arr* return {Array} */ function uniqueArray(arr) {const result []// outer: 標簽,標記外層循…

基于單片機設計的智能停車系統_271

文章目錄 一、前言 1.1 項目介紹 【1】項目開發背景 【2】設計實現的功能 【3】項目硬件模塊組成 【4】設計意義 【5】國內外研究現狀 【6】摘要 1.2 設計思路 1.3 系統功能總結 1.4 開發工具的選擇 【1】設備端開發 【2】上位機開發 1.5 參考文獻 1.6 系統框架圖 1.7 系統原理…

for in+邏輯表達式 生成迭代對象,最后轉化為列表 ——注意list是生成器轉化為列表,但[生成器]得到的就是一個列表,其中包含一個生成器元素

(int(digit) ** 2 for digit in str(n))這個不是 數組(list),而是一個 生成器表達式 (generator expression)。它的作用是:str(n) 把數字 n 轉成字符串,例如 n 82 → "82"。for digit in str(n) 遍歷字符串中的每個字符 → "…

通信算法之321:verilog中generate if 用法-綜合掉無用分支

文章目錄 一.示例代碼 二.優缺分析 三. generate - case 一.示例代碼 提示:參考 // 根據添加/補償頻偏的標志,確定使用的頻偏wire signed [WIDTH-1 : 0] freq;generateif(FREQ_FLAG == 1b1) beg

Shell 入門

目錄 一、Shell 是什么 二、 .sh 腳本調用 .py 腳本 Python 核心邏輯腳本(data_processor.py) Shell 腳本(pipeline.sh) 三、常見命令 四、.sh腳本 1. 簡單例子 2. 進階例子 3. 猜數字游戲 一、Shell 是什么 Shell 的本…

UNet改進(36):融合FSATFusion的醫學圖像分割

1. 注意力機制的理論基礎 1.1 空間注意力機制 空間注意力機制模擬人類視覺系統,能夠關注圖像中的顯著區域。其核心思想是根據特征圖的空間位置生成權重圖,突出重要區域并抑制無關信息。常見的實現方式是通過沿通道維度的池化操作獲取空間統計信息,然后通過卷積層生成空間注…

docker安裝kafka、zookeeper詳細步驟

Kafka 簡介 Kafka 是一個分布式流處理平臺,由 LinkedIn 開發并開源,主要用于高吞吐量的實時數據管道和流處理。 核心特性 高吞吐量:支持每秒百萬級消息處理,適合大數據場景。 持久化存儲:消息可持久化到磁盤,并支持多副本備份。 分布式架構:支持水平擴展,通過分區(P…

Photoshop - Ps 編輯圖像

使用基本圖像編輯技術,讓圖像展現出最好的一面。1.修剪和拉直使用裁剪工具,可以修剪邊緣,更改圖像的形狀和大小,甚至可以對圖像進行拉直和彎曲的操作。2.改善亮度和色彩點擊菜單欄-編輯-調整-亮度/對比度,調整圖像的亮…

SpringBoot 配置文件在運維開發中的應用

在 SpringBoot 項目的運維開發工作里,配置文件相關知識是繞不開的重要內容。它關乎著項目在不同環境下的靈活部署、參數調整,直接影響著應用的穩定性與可維護性。接下來,我們就從臨時屬性、屬性加載優先順序、配置文件分類這幾個維度&#xf…

雷卯國產化之SE3401完全替代AOS的AO3401

上海雷卯PMOS型號SE3401 pin to pin替代AOS型號AO3401,已經有很多客戶選用 SE3401替代AO3401,客戶可以獲得更好的價格和更快的交期。特別是在一些受空間收下限的小電子設備很受青睞。參數對比如下:以下是SE3401(P溝道MOSFET&#…

多語言與零樣本語音識別新突破:基于發音特征分類的方法

多語言與零樣本語音識別新突破:基于發音特征分類的方法 在語音識別領域,多語言和零樣本(zero-shot)語言的識別一直是一個極具挑戰性的課題。近期,京都大學的研究團隊提出了一種全新的方法,通過引入國際音標(IPA)和發音特征(Articulatory Features)來提升語音識別系統…

1.8 Memory

1.Memory簡介 2.Memory中各參數的功能和作用1.Memory簡介 1).Memory(內存)模塊它是unity中監視內存使用情況的關鍵工具, 它能幫助我們識別哪些資源在占有大量內存,是否存在內存泄露或垃圾回收頻繁等問題2).游戲中如果出現以下問題, 可以重點觀察memorya.游戲卡頓, 掉幀- 表現: …

國家統計局數據爬取——機器學習

這個代碼是一個用于爬取國家統計局網站數據的Python腳本。下面我將詳細解釋代碼的各個部分及其設計思路。 代碼結構概述 import requests # 發送HTTP請求 from bs4 import BeautifulSoup # 解析HTML import pandas as pd # 數據處理和存儲 import time # 時間控制 import…

內存管理(智能指針,內存對齊,野指針,懸空指針)

📌 1. 野指針 (Wild Pointer)什么是野指針?野指針指的是未初始化的指針變量。它指向的內存地址是隨機的、未知的。產生原因cppint* ptr; // 野指針!未初始化,指向隨機地址 *ptr 10; // 危險!可能破壞系統內存char* st…

Spring代理的特點

一.Spring代理的特點1.依賴注入和初始化影響的是原始的對象。2.代理和目標是兩個對象,二者成員變量不共用數據。二.測試首先準備以下幾個類。Bean1package com.example.springdemo.demos.a13;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.…

嵌入式學習日記(35)TCP并發服務器構建

單循環服務器:服務端同一時刻只能處理一個客戶端的任務并發服務器:服務端同一時刻可以處理多個客戶端的任務TCP并發服務器構建:TCP: 1. 建立連接,一對一TCP服務端并發模型:1. 多進程進程資源開銷大&#x…

【Flask】測試平臺開發實戰-第二篇

概述:在上一篇我們已經將后端初始化服務后前端的vue框架初始化已經搭建完整,并且可以運行看到界面,服務正常,當然我們看到的前端數據都是mock下的假數據,并不是真實的,這篇我們來開發實現第一個功能&#x…

聊一聊 .NET 的 AssemblyLoadContext 可插拔程序集

一:背景 1. 講故事 最近在分析一個崩潰dump時,發現禍首和AssemblyLoadContext有關,說實話這東西我也比較陌生,后來查了下大模型,它主要奔著替代 .NetFrameWork 時代的 AppDomain 的,都是用來做晚期加卸載&a…

Java中使用Spring Boot+Ollama實現本地AI的MCP接入

目錄結構完善spring bootpom.xml添加依賴application.ymlMCP 工具配置 mcp-servers.json配置類編寫API在我的上一篇文章搭建好本地的聊天機器人后,準備接入MCP進一步增強AI的能力,以實現類似手機AI的功能 參考的是第二篇文章鏈接其內容比較精煉&#x…