下载Kafka和ZooKeeper的镜像
docker pull wurstmeister/kafka
docker pull wurstmeister/zookeeper
为构建集群方便,创建docker虚拟网络
docker network create --driver bridge --subnet=172.18.12.0/16 --gateway=172.18.1.1 dockernet
创建kafka.yml文件
version: '2'
services:
zoo1:
image: wurstmeister/zookeeper
restart: unless-stopped
hostname: zoo1
ports:
- "2181:2181"
container_name: zookeeper
networks:
dockernet:
ipv4_address: 172.18.12.5
kafka1:
image: wurstmeister/kafka
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 172.18.12.6
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ZOOKEEPER_CONNECT: "172.18.12.5:2181"
KAFKA_BROKER_ID: 1
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_CREATE_TOPICS: "mendix.log.in:2:1"
depends_on:
- zoo1
container_name: kafka1
networks:
dockernet:
ipv4_address: 172.18.12.6
kafka2:
image: wurstmeister/kafka
ports:
- "9093:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 172.18.12.7
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ZOOKEEPER_CONNECT: "172.18.12.5:2181"
KAFKA_BROKER_ID: 2
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
depends_on:
- zoo1
container_name: kafka2
networks:
dockernet:
ipv4_address: 172.18.12.7
networks:
dockernet:
external:
name: dockernet
环境变量说明:
KAFKA_ADVERTISED_HOST_NAME:
zookeeper利用这个hostname在集群中的broker之间同步消息, 这里配置为kafka在docker虚拟网络中的IP。 使用你的宿主机的IP也可以,但是端口号要改成宿主机的端口号
KAFKA_ADVERTISED_PORT:
Kafka在Docker container中的端口号
备注
如果你需要在Docker虚拟网络之外使用Kafka集群,你需要把这两个参数配置成你宿主机的IP,端口号要改成Docker映射到宿主机的端口号(9092, 9093)。当往Kafka其中的一个broker发送消息时,Kafka集群从ZooKeeper取得Broker IP和端口号,然后同步数据,使用虚拟网络IP会导致发送和接收消息失败,因为宿主机无法访问Docker虚拟网络内的节点
例如我的宿主机IP是,192.168,0.2,
上述2个Kafka容器,9092端口号分别映射到宿主机的9092和9093端口。
环境变量配置如下
Kafka1配置为
KAFKA_ADVERTISED_HOST_NAME: 192.168.0.2
KAFKA_ADVERTISED_PORT: 9092
Kafka2配置为
KAFKA_ADVERTISED_HOST_NAME: 192.168.0.2
KAFKA_ADVERTISED_PORT: 9093
启动Dockers
docker-compose -f kafka.yml up -d
测试
进入容器zookeeper
docker exec -it zookeeper /bin/bash
检查是否已经成功建立topic
root@zoo1:/# cd $ZK_HOME/bin
root@zoo1:/opt/zookeeper-3.4.13/bin# ./zkCli.sh
[zk: localhost:2181(CONNECTED) 0] ls /brokers/topics
[__consumer_offsets, test, mendix.log.in]
测试Kafka消息发送
进入容器kafka2, 利用kafka-console-producer.sh向broker2发送消息
>docker exec -it kafka2 /bin/bash
bash-4.4# cd /opt/kafka/bin
bash-4.4# kafka-console-producer.sh --broker-list localhost:9092 --topic mendix.log.in
>test1
>test2
>test 3
>
测试Kafka消息接收
进入容器kafka1, 利用kafka-console-producer.sh从broker1接收消息
docker exec -it kafka1 /bin/bash
cd /opt/kafka/bin
bash-4.4# kafka-console-consumer.sh --bootstrap-server localhost:9092 -topic mendix.log.in
test1
test2
test 3