如何用docker部署kafka
摘抄引用
Docker鏡像選型
Kafka是沒有官方Docker鏡像的,所以要么自己寫一個Dockerfile,要么用第三方已經(jīng)構(gòu)建好的。
自己寫一個Dockerfile不是不可以,但不符合我要“最快”的目標(biāo),所以用第三方已經(jīng)構(gòu)建好的鏡像那是最快的。
由于是第三方鏡像,希望已經(jīng)用過的人越多越好,這樣坑相對會比較少一些。
帶著上面的要求,開始尋找合適的第三方鏡像,比較出名的有以下幾個:
wurstmeister/kafka
特點:star數(shù)最多,版本更新到 Kafka 1.0,zookeeper與kafka分開于不同鏡像。spotify/kafka
特點:star數(shù)較多,有很多文章或教程推薦,zookeeper與kafka置于同一鏡像中;但kafka版本較老(還停留在0.10.1.0)。confluent/kafka
背景:Confluent是書中提到的哪位開發(fā)Kafka的Jay Kreps從LinkedLn離職后創(chuàng)立的新公司,Confluent Platform是一個流數(shù)據(jù)平臺,圍繞Kafka打造了一系列的產(chǎn)品。特點:大咖操刀,文檔詳盡,但是也和Confluent Platform進(jìn)行了捆綁。
上述三個項目中,最終選定使用wurstmeister/kafka
,star最多,版本一直保持更新,用起來應(yīng)該比較放心。
wurstmeister/kafka鏡像簡介的先決條件
- 安裝
docker-compose
- 在
docker-compose.yml
配置文件中修改KAFKA_ADVERTISED_HOST_NAME
去匹配你的docker主機IP(注意:如果你想要運行多broker集群,不要使用localhost
或127.0.0.1
作為主機ip) - 如果你想要添加自定義的Kafka參數(shù),只需要將它們添加到
docker-compose.yml
。例如:- 增加
message.max.bytes
參數(shù),添加KAFKA_MESSAGE_MAX_BYTES: 2000000
到environment
部分。 - 關(guān)閉自動主題創(chuàng)建集,配置
KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'false'
- 增加
- Kafka可以通過添加環(huán)境變量前綴
LOG4J_
來自定義log4j用法。這些環(huán)境變量會映射到log4j.properties
。例如:LOG4J_LOGGER_KAFKA-AUTHORIZER_LOGGER=DEBUG,authorizerAppender
**注意:**配置網(wǎng)絡(luò)有幾個“問題”。如果你不知道的要求是什么,請查看連接指南
簡單使用
啟動集群:
docker-compose up -d
添加更多brokers
docker-compose scale kafka=3
銷毀一個集群
docker-compose stop
安裝過程
1. 安裝Docker(略)
2. 安裝Docker Compose(略)
3. 從github拉取最新打包資源
# 克隆docker制作腳本 git clone https://github.com/wurstmeister/kafka-docker.git # 進(jìn)入目錄查看目錄文件 cd kafka-docker # 查看所有標(biāo)簽,找到最新版本 git tag # 切換到最新版本 git checkout <last_tag_name>
kafka-docker倉庫目錄文件展示:
[root@jiewli kafka-docker]# ll 總用量 72 -rwxr-xr-x. 1 root root 210 7月 7 17:18 broker-list.sh -rw-r--r--. 1 root root 969 7月 7 17:18 CHANGELOG.md -rwxr-xr-x. 1 root root 1221 7月 7 17:18 create-topics.sh -rw-r--r--. 1 root root 367 7月 7 17:08 docker-compose-single-broker.yml -rw-r--r--. 1 root root 705 7月 7 17:08 docker-compose-swarm.yml -rw-r--r--. 1 root root 324 7月 7 17:18 docker-compose.yml -rw-r--r--. 1 root root 1132 7月 7 17:18 Dockerfile -rwxr-xr-x. 1 root root 395 7月 7 17:18 download-kafka.sh -rw-r--r--. 1 root root 11325 7月 7 17:08 LICENSE -rw-r--r--. 1 root root 9887 7月 7 17:18 README.md -rwxr-xr-x. 1 root root 4591 7月 7 17:18 start-kafka.sh -rwxr-xr-x. 1 root root 131 7月 7 17:08 start-kafka-shell.sh drwxr-xr-x. 2 root root 4096 7月 7 17:18 test
4. 更新docker-compose.yml中你docker主機ip
通過命令vim docker-compose.yml
查看倉庫目錄中的docker-compose.yml
配置文件。
version: '2' services: zookeeper: image: wurstmeister/zookeeper ports: - "2181:2181" kafka: build: . ports: - "9092" environment: DOCKER_API_VERSION: 1.22 KAFKA_ADVERTISED_HOST_NAME: 192.168.99.100 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 volumes: - /var/run/docker.sock:/var/run/docker.sock
重要:
kafka 0.9.x以后的版本新增了advertised.listeners
配置
kafka 0.9.x以后的版本不要使用 advertised.host.name
和 advertised.host.port
已經(jīng) deprecated
host.name
和 port
為 deprecated,使用 listeners
代替
所以,KAFKA_ADVERTISED_HOST_NAME
配置也要改成 KAFKA_ADVERTISED_LISTENERS
, 而后者要求必須配置 KAFKA_LISTENERS
,不然會拋異常:
ERROR: Missing environment variable KAFKA_LISTENERS. Must be specified when using KAFKA_ADVERTISED_LISTENERS
version: '2' services: zookeeper: image: wurstmeister/zookeeper ports: - "2181:2181" kafka: build: . ports: - "9092" environment: DOCKER_API_VERSION: 1.22 KAFKA_LISTENERS: PLAINTEXT://:9092 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.99.100:9094 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 volumes: - /var/run/docker.sock:/var/run/docker.sock
將上面KAFKA_ADVERTISED_HOST_NAME
改為你的docker主機ip。
如果你想要添加自定義的Kafka參數(shù),只需要將它們添加到docker-compose.yml
。例如:
- 增加
message.max.bytes
參數(shù),添加KAFKA_MESSAGE_MAX_BYTES: 2000000
到environment
部分。 - 關(guān)閉自動主題創(chuàng)建集,配置
KAFKA_AUTO_CREATE_TOPICS_ENABLE: 'false'
啟動失敗:
[root@jiewli kafka-docker]# docker logs -f --tail=300 kafka-docker_kafka_1
ERROR: Missing environment variable KAFKA_LISTENERS. Must be specified when using KAFKA_ADVERTISED_LISTENERS
ERROR: Missing environment variable KAFKA_LISTENERS. Must be specified when using KAFKA_ADVERTISED_LISTENERS
ERROR: Missing environment variable KAFKA_LISTENERS. Must be specified when using KAFKA_ADVERTISED_LISTENERS
ERROR: Missing environment variable KAFKA_LISTENERS. Must be specified when using KAFKA_ADVERTISED_LISTENERS
ERROR: Missing environment variable KAFKA_LISTENERS. Must be specified when using KAFKA_ADVERTISED_LISTENERS
ERROR: Missing environment variable KAFKA_LISTENERS. Must be specified when using KAFKA_ADVERTISED_LISTENERS
ERROR: Missing environment variable KAFKA_LISTENERS. Must be specified when using KAFKA_ADVERTISED_LISTENERS
ERROR: Missing environment variable KAFKA_LISTENERS. Must be specified when using KAFKA_ADVERTISED_LISTENERS
ERROR: Missing environment variable KAFKA_LISTENERS. Must be specified when using KAFKA_ADVERTISED_LISTENERS
5. 啟動集群
$ docker-compose up -d
例如,啟動一個有兩個broker
的的集群
$ docker-compose scale kafka=2
這會啟動一個單獨的zookeeper
實例,和兩個Kafka
實例。你可以使用docker-compose ps
命令去顯示正在運行的實例。
如果你想去添加更多的Kafka
brokers,只需要通過命令docker-compose scale kafka=n
增加值。
5.1 當(dāng)執(zhí)行docker-compose -f docker-compose.yml up -d
命令遇到錯誤
wget: server returned error: HTTP/1.1 404 Not Found
The command '/bin/sh -c apk add --no-cache bash curl jq docker && mkdir /opt && chmod a+x /tmp/*.sh && mv /tmp/start-kafka.sh /tmp/broker-list.sh /tmp/create-topics.sh /usr/bin && sync && /tmp/download-kafka.sh && tar xfz /tmp/kafka_${SCALA_VERSION}-${KAFKA_VERSION}.tgz -C /opt && rm /tmp/kafka_${SCALA_VERSION}-${KAFKA_VERSION}.tgz && ln -s /opt/kafka_${SCALA_VERSION}-${KAFKA_VERSION} /opt/kafka && rm /tmp/* && wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VERSION}/glibc-${GLIBC_VERSION}.apk && apk add --no-cache --allow-untrusted glibc-${GLIBC_VERSION}.apk && rm glibc-${GLIBC_VERSION}.apk' returned a non-zero code: 1
ERROR: Service 'kafka' failed to build
根據(jù)提示,是wget
命令下載某個文件的時候遇到了404。
5.2 分析腳本執(zhí)行過程
從Dockerfile
的RUN
指令中可以找到:
經(jīng)過一番排查,最終定位到download-kafka.sh
這個腳本中的wget
命令,我增加一行echo
命令,將整個wget
命令打印出來看看:
# echo打印結(jié)果
wget -q "https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/1.1.0/kafka_2.12-1.1.0.tgz" -O "/tmp/kafka_2.12-1.1.0.tgz"
根據(jù)鏈接查找這個文件,發(fā)現(xiàn)是在“清華大學(xué)開源軟件鏡像站”中下載的,但是1.1.0
這個目錄都沒有了,取而代之的是2.x.x
的目錄了。
下載不了,很明顯這個版本太落后了。一看倉庫git-tag的創(chuàng)建時間居然是2018年,已經(jīng)三年多沒有發(fā)布新的tag版本了。
5.3 使用master分支的構(gòu)建腳本啟動2.x.x
版本的kafka
那么回到master
分支看看,一看最新提交,2021年6月有提交過。仔細(xì)研究了一下master分支的腳本和Dockerfile,其實作者早已經(jīng)將kafka版本調(diào)整到2.x.x
,并且修改了下載地址。
那么切換到master分支后,重新使用命令$ docker-compose up -d
啟動kafka集群就可以了。
6. 開啟單個節(jié)點
docker-compose -f docker-compose-single-broker.yml up -d
開啟容器如下所示:
[root@jiewli ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 43fb3efd832f kafka-docker_kafka "start-kafka.sh" 24 hours ago Up 4 hours 0.0.0.0:9092->9092/tcp kafka-docker_kafka_1 b8bc06090259 wurstmeister/zookeeper "/bin/sh -c '/usr/sb…" 24 hours ago Up 4 hours 22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp kafka-docker_zookeeper_1
Kafka Shell
進(jìn)入docker容器交互命令行
docker exec -it kafka-docker_kafka_1 /bin/bash
查看 kafka 安裝目錄,找到腳本位置
bash-5.1# echo $KAFKA_HOME /opt/kafka bash-5.1# cd $KAFKA_HOME bash-5.1# ls LICENSE NOTICE bin config libs licenses logs site-docs
默認(rèn)情況下,kafka 安裝目錄是 /opt/kafka
你可以通過Kafka Shell與你的Kafka集群進(jìn)行交互。
$ $KAFKA_HOME/bin/start-kafka-shell.sh <DOCKER_HOST_IP> <ZK_HOST:ZK_PORT>
測試
測試你的安裝步驟。
啟動一個shell終端,創(chuàng)建一個topic和啟動一個生產(chǎn)者。
$ $KAFKA_HOME/bin/kafka-topics.sh --create --topic topic \ --partitions 4 --zookeeper $ZK --replication-factor 2 $ $KAFKA_HOME/bin/kafka-topics.sh --describe --topic topic --zookeeper $ZK $ $KAFKA_HOME/bin/kafka-console-producer.sh --topic=topic \ --broker-list=`broker-list.sh`
啟動另一個shell終端,并啟動一個消費者。
$ $KAFKA_HOME/bin/kafka-console-consumer.sh --topic=topic --zookeeper=$ZK
在MAC電腦上運行Kafka-docker
安裝Docker Toolbox
,并將docker-machine ip
命令返回的ip配置到KAFKA_ADVERTISED_HOST_NAME
故障排除
- 默認(rèn)情況下,Kafka broker使用1GB內(nèi)存,因此如果您在啟動代理是遇到問題,請檢查
docker-compose logs
/docker logs
查找容器并確保主機上有足夠的可用內(nèi)存。 - 如果要運行多個broker,請不要使用
localhost
或127.0.0.1
作為主機IP,否則broker將無法通信。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker中容器數(shù)據(jù)卷(Data Volume)和數(shù)據(jù)管理詳解
本文主要給大家介紹了關(guān)于Docker中容器數(shù)據(jù)卷(Data Volume)和數(shù)據(jù)管理的相關(guān)資料,文中介紹的很詳細(xì),對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-02-02docker上安裝和卸載MySQL數(shù)據(jù)庫詳細(xì)圖文教程
Docker是一種容器化技術(shù),可以快速方便地部署和管理應(yīng)用程序,Mysql 是一個開源的關(guān)系型數(shù)據(jù)庫管理,系統(tǒng)這篇文章主要給大家介紹了關(guān)于docker上安裝和卸載MySQL數(shù)據(jù)庫的相關(guān)資料,需要的朋友可以參考下2024-05-05Docker deamon.json文件修改之后重啟不生效的問題解決
修改了Docker的配置文件daemon.json,但重啟Docker服務(wù)后發(fā)現(xiàn)配置沒有生效,下面就來解決這個問題,感興趣的可以了解一下2025-05-05在vscode中使用ssh運行docker:從下載到運行全流程
首先在本機或者服務(wù)器上下載docker并運行,本文目的旨在本機下載docker并打包,然后在服務(wù)器上進(jìn)行加載,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-08-08如何給一個正在運行的Docker容器動態(tài)添加Volume
這篇文章主要介紹了如何給一個正在運行的Docker容器動態(tài)添加Volume,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03使用Docker安裝和配置 MySQL 數(shù)據(jù)庫的過程詳解
本文將介紹如何使用Docker來安裝和配置MySQL數(shù)據(jù)庫,以便在開發(fā)和測試環(huán)境中快速搭建MySQL實例,本文也是介紹兩種方式進(jìn)行分別是“使用鏡像安裝”、“使用Docker Compose安裝”,感興趣的朋友一起看看吧2023-12-12