因爲kafka
依賴zookeeper
,所以須要使用 docker 同時安裝zookeeper
和 kafka
。linux
坑:因爲 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
docker run -d --name zookeeper -p 2181:2181 wurstmeister/zookeeper
-d
參數設置後臺運行--name zookeeper
參數指定容器別名-p 2181:2181
參數綁定容器端口到宿主端口注意,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_ZOOKEEPER_CONNECT={host-ip}:{zookeeper-port}/kafka
KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://{host-ip}:9092
KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092
好比個人電腦是 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/kafka
app
docker exec -it kafka bash
注意,此時應該已經進入到了容器中的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-console-producer.sh --broker-list localhost:9092 --topic first-topic
看到出現了個對話提示的小>
就能夠發送消息了,不過不要着急,先把消費者啓動了。
另起一個終端,進入 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