macOS 下 使用 docker 安裝 kafka、遇到的坑與解決方案。

macOS 下 使用 docker 安裝 kafka

因爲kafka依賴zookeeper,所以須要使用 docker 同時安裝zookeeperkafkalinux

坑:因爲 macOS 的 docker 底層實現的不一樣,網上的不少教程放在 macOS 中並不能成功運行,主要緣由是 macOS 的 docker 在容器和宿主之間沒法經過 ip 直接通訊。所以在安裝的時候須要特殊注意與 ip 相關的設置,當容器須要訪問宿主ip時,須要使用docker.for.mac.host.internal或者host.docker.internal代替。docker

拉取鏡像

docker pull wurstmeister/zookeeper
docker pull wurstmeister/kafka

啓動容器

啓動 zookeeper

docker run -d --name zookeeper -p 2181:2181 wurstmeister/zookeeper
  • -d 參數設置後臺運行
  • --name zookeeper 參數指定容器別名
  • -p 2181:2181 參數綁定容器端口到宿主端口

啓動 kafka

注意,kafka 依賴 zookeeper,啓動 kafka 前須要先啓動 zookeeper。shell

如下配置默認 kafka 端口配置在 9092 端口。bootstrap

docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT={host-ip}:{zookeeper-port}/kafka -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://{host-ip}:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka

-d 參數指定容器後臺運行windows

--name kafka 參數指定容器別名api

-e 參數能夠設置 docker 容器內環境變量,每一個變量的解釋:bash

  • KAFKA_BROKER_ID=0
    在 kafka 集羣中,每一個 kafka 都有一個 BROKER_ID 來區分本身
  • KAFKA_ZOOKEEPER_CONNECT={host-ip}:{zookeeper-port}/kafka
    配置 zookeeper 管理 kafka 的路徑
  • KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://{host-ip}:9092
    把 kafka 的地址端口註冊給 zookeeper
  • KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092
    kafka 監聽地址

好比個人電腦是 mac,在 host-ip 這塊就不能填本機 ip(windows 和 linux 能夠),須要填docker.for.mac.host.internal,zookeeper 端口啓動在2181,kafka 即將啓動在9092,那麼個人命令是這樣的docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=docker.for.mac.host.internal:2181/kafka -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://docker.for.mac.host.internal:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafkaapp

測試功能是否正常

測試 kafka 生產與消費

進入 kafka 容器

docker exec -it kafka bash

進入 kafka 容器中的腳本目錄

注意,此時應該已經進入到了容器中的bash測試

進入 kafka 的腳本目錄,其中kafka_2.12-2.5.0可能會隨着版本而變化數字。.net

cd /opt/kafka_2.12-2.5.0/bin

經過 ls 能夠看到許多的.sh 腳本

bash-4.4# ls
connect-distributed.sh               kafka-delete-records.sh              kafka-server-stop.sh
connect-mirror-maker.sh              kafka-dump-log.sh                    kafka-streams-application-reset.sh
connect-standalone.sh                kafka-leader-election.sh             kafka-topics.sh
kafka-acls.sh                        kafka-log-dirs.sh                    kafka-verifiable-consumer.sh
kafka-broker-api-versions.sh         kafka-mirror-maker.sh                kafka-verifiable-producer.sh
kafka-configs.sh                     kafka-preferred-replica-election.sh  trogdor.sh
kafka-console-consumer.sh            kafka-producer-perf-test.sh          windows
kafka-console-producer.sh            kafka-reassign-partitions.sh         zookeeper-security-migration.sh
kafka-consumer-groups.sh             kafka-replica-verification.sh        zookeeper-server-start.sh
kafka-consumer-perf-test.sh          kafka-run-class.sh                   zookeeper-server-stop.sh
kafka-delegation-tokens.sh           kafka-server-start.sh                zookeeper-shell.sh
bash-4.4#

測試 kafka 生產者和消費者

啓動 kafka 生產者

運行 kafka 生產者發送消息

./kafka-console-producer.sh --broker-list localhost:9092 --topic first-topic

看到出現了個對話提示的小>就能夠發送消息了,不過不要着急,先把消費者啓動了。

啓動 kafka 消費者

另起一個終端,進入 kafka 容器,進入/opt/kafka_2.12-2.5.0/bin目錄,運行 kafka 消費者接收消息

./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic first-topic --from-beginning
測試發送和接收消息

在生產者中發送Hello,消費者中應該可以收到Hello

生產者

jabin@jabindeiMac ~/code/tmp » docker exec -it kafka bash
bash-4.4# cd /opt/kafka_2.12-2.5.0/bin/
bash-4.4# ./kafka-console-producer.sh --broker-list localhost:9092 --topic first-topic
>Hello
>

消費者

jabin@jabindeiMac ~/code/tmp » docker exec -it kafka bash
bash-4.4# cd /opt/kafka_2.12-2.5.0/bin/
bash-4.4# ./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic first-topic --from-beginning
Hello

參考文章

https://www.jianshu.com/p/e8c29cba9fae
https://docs.docker.com/docker-for-mac/networking/
https://yuanmomo.net/2019/06/13/docker-network/
https://www.jianshu.com/p/052f9c6ca664

相關文章
相關標籤/搜索