如果你不会用 kafka-docker,看这里

3,893 阅读2分钟

前言

本文主要讲述使用Docker如何搭建Kafka的单机版以及集群版,并对遇到的问题进行一定的解答,希望对初学者有一定的帮助。

本文所使用的镜像是: wurstmeister/kafka。

依赖

1.由于kafka容器使用docker-compose构建,所以确保已经安装此工具。
2.kafka依赖Zookeeper,所以还要下载 Zookeeper 的镜像。

单机版

根据 wurstmeister/kafka-docker 这个项目的README,构建单机版的Kafka的步骤如下:

注:这种方式kafka的broker数量不可扩展。

# 1.第一步需要拷贝项目,目的是得到 docker-compose-single-broker.yml
git clone git@github.com:wurstmeister/kafka-docker.git

# 2.手动下拉镜像(主要是想指定版本)
$ docker pull wurstmeister/kafka:2.11-0.11.0.3
$ docker pull wurstmeister/zookeeper

# 3.单机版的配置如下(docker-compose-single-broker.yml):
# 这里修改了两处:一是指定kafka镜像的版本;二是去掉KAFKA_CREATE_TOPICS配置,方便对比
version: '2'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka:2.11-0.11.0.3
    ports:
      - "9092:9092"
    environment:
      # 注意这里需要替换为你自己的IP
      KAFKA_ADVERTISED_HOST_NAME: 192.168.0.101
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

# 4.启动一个单机版kafka
$ docker-compose -f docker-compose-single-broker.yml up -d

CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                                                NAMES
a658b963e52c        wurstmeister/kafka:2.11-0.11.0.3   "start-kafka.sh"         7 seconds ago       Up 6 seconds        0.0.0.0:9092->9092/tcp                               kafka-docker_kafka_1
6c0a820e0a5a        wurstmeister/zookeeper             "/bin/sh -c '/usr/sb…"   7 seconds ago       Up 6 seconds        22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp   kafka-docker_zookeeper_1


# 测试能否扩展(docker-compose --scale 等同于 docker-compose scale)
$ docker-compose stop
$ docker-compose -f docker-compose-single-broker.yml up --scale kafka=3 -d

创建失败,提示 WARNING: The "kafka" service specifies a port on the host. 
If multiple containers for this service are created on a single host, the port will clash.

集群版

集群版和单机版主要在于配置的不同,所以有些类似的步骤下文有省略。

# 1.前面和单机版一样,需要下载镜像

# 2.集群版配置(docker-compose.yml)
# 可以看到,集群版和单机版只在于端口的不同
version: '2'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka:2.11-0.11.0.3
    ports:
      - "9092"
    environment:
      # 注意这里需要替换为你自己的IP
      KAFKA_ADVERTISED_HOST_NAME: 192.168.0.101
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock


# 3.测试运行集群版的kafka
docker-compose -f docker-compose.yml up --scale kafka=3 -d

# 可以看到启动了一个集群
CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                                                NAMES
77b73c627b46        wurstmeister/kafka:2.11-0.11.0.3   "start-kafka.sh"         6 seconds ago       Up 3 seconds        0.0.0.0:32773->9092/tcp                              kafka-docker_kafka_1
fb4f8b6f7989        wurstmeister/kafka:2.11-0.11.0.3   "start-kafka.sh"         10 seconds ago      Up 8 seconds        0.0.0.0:32772->9092/tcp                              kafka-docker_kafka_2
d67ba904e1d0        wurstmeister/kafka:2.11-0.11.0.3   "start-kafka.sh"         10 seconds ago      Up 8 seconds        0.0.0.0:32771->9092/tcp                              kafka-docker_kafka_3
6c0a820e0a5a        wurstmeister/zookeeper             "/bin/sh -c '/usr/sb…"   11 minutes ago      Up 6 minutes        22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp   kafka-docker_zookeeper_1

连接测试

# 创建一个topic
$ docker exec kafka-docker_kafka_1 \
kafka-topics.sh \
--create --topic topic001 \
--partitions 1 \
--zookeeper zookeeper:2181 \
--replication-factor 1

Created topic "topic001".

# 查看topic
$ docker exec kafka-docker_kafka_1 kafka-topics.sh --list --zookeeper zookeeper:2181 topic001

topic001

答疑

可能大部分人会比较好奇,为什么单机版和集群版的区别只在于端口的不同?

作者的wiki讲到,单机版的kafka网络拓扑图如下: 20200929092457.png

而集群版的网络拓扑图如下: 20200929093934.png

对于单机版,它只有一个Broker,它的端口9092可以直接映射到宿主机的9092端口,并不会造成端口冲突,所以使用 "9092:9092" 是没问题的。

而对于集群版,它有多个Broker,如果所有Broker的端口都映射到宿主机的9092端口,就会造成端口冲突(即上图的32200和32201都变成9092),所以必须使用 "9092" 代替。

注:如果还想继续深入,可以查看作者的wiki,在参考链接中。

参考

kafka-docker README
kafka-docker wiki

如果你对我的其他文章感兴趣,可以查看我的掘金主页或者关注我的公众号 "言淦说",欢迎你的点赞以及关注!