当前位置:   article > 正文

Docker搭建Zookeeper&Kafka集群_docker zookeeper kafka

docker zookeeper kafka

Docker搭建Zookeeper&Kafka集群

最近在学习Kafka,准备测试集群状态的时候感觉无论是开三台虚拟机或者在一台虚拟机开辟三个不同的端口号都太麻烦了(嗯。。主要是懒)。

环境准备

一台可以上网且有CentOS7虚拟机的电脑

> 为什么使用虚拟机?因为使用的笔记本,所以每次连接网络IP都会改变,还要总是修改配置文件的,过于繁琐,不方便测试。(通过Docker虚拟网络的方式可以避免此问题,当时实验的时候没有了解到) # Docker 安装 > 如果已经安装Docker请忽略此步骤

  1. Docker支持以下的CentOS版本:
  2. CentOS 7 (64-bit):要求系统为64位、系统内核版本为 3.10 以上。
  3. CentOS 6.5(64-bit)或更高的版本:要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。
  4. CentOS 仅发行版本中的内核支持 Docker。

yum安装#

Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看上文的前提条件来验证你的CentOS 版本是否支持 Docker 。

  1. # 查看内核版本
  2. $ uname -a
  3. #安装 Docker
  4. $ yum -y install docker
  5. #启动 Docker 后台服务
  6. $ service docker start
  7. # 由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。
  8. $ docker run hello-world

脚本安装#

  1. 使用 sudo 或 root 权限登录 Centos。
  2. 确保 yum 包更新到最新。

$ sudo yum update

  1. 获取并执行 Docker 安装脚本。
  1. $ curl -fsSL https://get.docker.com -o get-docker.sh
  2. # 执行这个脚本会添加 docker.repo 源并安装 Docker。
  3. $ sudo sh get-docker.sh

启动Docker#

  1. $ sudo systemctl start docker
  2. # 验证 docker 是否安装成功并在容器中执行一个测试的镜像。
  3. $ sudo docker run hello-world $ docker ps

镜像加速#

开始让我配置国内镜像源的时候我是拒绝的,但是使用之后发现那下载速度 duang~ 的一下就上去了。所以强烈建议大家配置国内镜像源。
打开/创建 /etc/docker/daemon.json 文件,添加以下内容:

{ "registry-mirrors": ["http://hub-mirror.c.163.com"] }

Zookeeper集群搭建

Zookeeper镜像:zookeeper:3.4

## 镜像准备 ``` $ docker pull zookeeper:3.4 ``` > 查找镜像可以去 https://hub.docker.com/ docker pull images:TAG // 代表拉取 `TAG` 版本的 `image` 镜像

建立独立Zookeeper容器#

我们首先用最简单的方式创建一个独立的Zookeeper节点,然后我们根据这个例子创建出其他的节点。

$ docker run --name zookeeper -p 2181:2181 -d zookeeper:3.4

默认的,容器内配置文件在, /conf/zoo.cfg,数据和日志目录默认在 /data 和 /datalog,需要的话可以将上述目录映射到宿主机。
参数解释

  1. --name:指定容器名字
  2. -p:为容器暴露出来的端口分配端口号
  3. -d:在后台运行容器并打印容器ID

集群搭建#

其它节点的Zookeeper容器创建方式与创建独立容器类似,需要注意的是,要分别指定节点的id和修改文件中多节点的配置,相应的创建命令如下:

新建docker网络#

  1. $ docker network create zoo_kafka
  2. $ docker network ls

Zookeeper容器1#

  1. $ docker run -d \
  2. --restart=always \
  3. -v /opt/docker/zookeeper/zoo1/data:/data \
  4. -v /opt/docker/zookeeper/zoo1/datalog:/datalog \
  5. -e ZOO_MY_ID=1 \
  6. -p 2181:2181 \
  7. -e ZOO_SERVERS="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888" \
  8. --name=zoo1 \
  9. --net=viemall-zookeeper \
  10. --privileged \
  11. zookeeper:3.4

Zookeeper容器2#

  1. $ docker run -d \
  2. --restart=always \
  3. -v /opt/docker/zookeeper/zoo2/data:/data \
  4. -v /opt/docker/zookeeper/zoo2/datalog:/datalog \
  5. -e ZOO_MY_ID=2 \
  6. -p 2182:2181 \
  7. -e ZOO_SERVERS="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888" \
  8. --name=zoo2 \
  9. --net=viemall-zookeeper \
  10. --privileged \
  11. zookeeper:3.4

Zookeeper容器3#

  1. $ docker run -d \
  2. --restart=always \
  3. -v /opt/docker/zookeeper/zoo3/data:/data \
  4. -v /opt/docker/zookeeper/zoo3/datalog:/datalog \
  5. -e ZOO_MY_ID=3 \
  6. -p 2183:2181 \
  7. -e ZOO_SERVERS="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888" \
  8. --name=zoo3 \
  9. --net=viemall-zookeeper \
  10. --privileged \
  11. zookeeper:3.4

这种方式虽然也实现了我们想要的,但是步骤过于繁琐,而且维护起来麻烦(懒癌晚期),所以我们使用 docker-compose 的方式来实现。

docker-compose 搭建zookeeper集群#

新建docker网络#

  1. $ docker network create viemall-zookeeper
  2. $ docker network ls

编写 docker-compose.yml 脚本#

使用方式:

  1. 安装 docker-compose
    1. $ docker run -d \
    2. --restart=always \
    3. -v /opt/docker/zookeeper/zoo3/data:/data \
    4. -v /opt/docker/zookeeper/zoo3/datalog:/datalog \
    5. -e ZOO_MY_ID=3 \
    6. -p 2183:2181 \
    7. -e ZOO_SERVERS="server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888" \
    8. --name=zoo3 \
    9. --net=viemall-zookeeper \
    10. --privileged \
    11. zookeeper:3.4

  2. 任意目录下新建 docker-compose.yml 文件,复制以下内容
  3. 执行命令 docker-compose up -d

命令对照

命令解释
docker-compose up启动所有容器
docker-compose up -d后台启动并运行所有容器
docker-compose up --no-recreate -d不重新创建已经停止的容器
docker-compose up -d test2只启动test2这个容器
docker-compose stop停止容器
docker-compose start启动容器
docker-compose down停止并销毁容器

docker-compose.yml下载地址:https://github.com/JacianLiu/docker-compose/tree/master/zookeeper
docker-compose.yml详情

 
  1. version: '2'
  2. services:
  3. zoo1:
  4. image: zookeeper:3.4 # 镜像名称
  5. restart: always # 当发生错误时自动重启
  6. hostname: zoo1
  7. container_name: zoo1
  8. privileged: true
  9. ports: # 端口
  10. - 2181:2181
  11. volumes: # 挂载数据卷
  12. - ./zoo1/data:/data
  13. - ./zoo1/datalog:/datalog
  14. environment:
  15. TZ: Asia/Shanghai
  16. ZOO_MY_ID: 1 # 节点ID
  17. ZOO_PORT: 2181 # zookeeper端口号
  18. ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 # zookeeper节点列表
  19. networks:
  20. default:
  21. ipv4_address: 172.23.0.11
  22. zoo2:
  23. image: zookeeper:3.4
  24. restart: always
  25. hostname: zoo2
  26. container_name: zoo2
  27. privileged: true
  28. ports:
  29. - 2182:2181
  30. volumes:
  31. - ./zoo2/data:/data
  32. - ./zoo2/datalog:/datalog
  33. environment:
  34. TZ: Asia/Shanghai
  35. ZOO_MY_ID: 2
  36. ZOO_PORT: 2181
  37. ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
  38. networks:
  39. default:
  40. ipv4_address: 172.23.0.12
  41. zoo3:
  42. image: zookeeper:3.4
  43. restart: always
  44. hostname: zoo3
  45. container_name: zoo3
  46. privileged: true
  47. ports:
  48. - 2183:2181
  49. volumes:
  50. - ./zoo3/data:/data
  51. - ./zoo3/datalog:/datalog
  52. environment:
  53. TZ: Asia/Shanghai
  54. ZOO_MY_ID: 3
  55. ZOO_PORT: 2181
  56. ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
  57. networks:
  58. default:
  59. ipv4_address: 172.23.0.13
  60. networks:
  61. default:
  62. external:
  63. name: zoo_kafka

验证#

从图中我们可以看出,有一个Leader,两个Flower,至此我们的Zookeeper集群就已经搭建好了
Zookeeper

Kafka集群搭建

有了上面的基础,再去搞Kafka集群还是问题吗?其实就是几个变量值不同而已。

有了上边的例子,就不费劲去搞单节点的Kafka了,直接使用docker-compose的方式,部署三个节点,其实方式大同小异,上边也说到,其实就是一些属性不同而已;这时候我们就不需要再去新建 Docker 网络了,直接使用前边搭建 Zookeeper 集群时创建的网络即可!

环境准备#

Kafka镜像:wurstmeister/kafka
Kafka-Manager镜像:sheepkiller/kafka-manager

# 不指定版本默认拉取最新版本的镜像

docker pull wurstmeister/kafka

docker pull sheepkiller/kafka-manager

编写 docker-compose.yml 脚本#

使用方式:

  1. 安装 docker-compose
 

# 获取脚本 $ curl -L https://github.com/docker/compose/releases/download/1.25.0-rc2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose # 赋予执行权限

$chmod +x /usr/local/bin/docker-compose

  1. 任意目录下新建 docker-compose.yml 文件,复制以下内容
  2. 执行命令 docker-compose up -d

命令对照

命令解释
docker-compose up启动所有容器
docker-compose up -d后台启动并运行所有容器
docker-compose up --no-recreate -d不重新创建已经停止的容器
docker-compose up -d test2只启动test2这个容器
docker-compose stop停止容器
docker-compose start启动容器
docker-compose down停止并销毁容器

docker-compose.yml下载地址:https://github.com/JacianLiu/docker-compose/tree/master/zookeeper
docker-compose.yml详细内容

  1. version: '2'
  2. services:
  3. broker1:
  4. image: wurstmeister/kafka
  5. restart: always
  6. hostname: broker1
  7. container_name: broker1
  8. privileged: true
  9. ports:
  10. - "9091:9092"
  11. environment:
  12. KAFKA_BROKER_ID: 1
  13. KAFKA_LISTENERS: PLAINTEXT://broker1:9092
  14. KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker1:9092
  15. KAFKA_ADVERTISED_HOST_NAME: broker1
  16. KAFKA_ADVERTISED_PORT: 9092
  17. KAFKA_ZOOKEEPER_CONNECT: zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
  18. JMX_PORT: 9988
  19. volumes:
  20. - /var/run/docker.sock:/var/run/docker.sock
  21. - ./broker1:/kafka/kafka\-logs\-broker1
  22. external_links:
  23. - zoo1
  24. - zoo2
  25. - zoo3
  26. networks:
  27. default:
  28. ipv4_address: 172.23.0.14
  29. broker2:
  30. image: wurstmeister/kafka
  31. restart: always
  32. hostname: broker2
  33. container_name: broker2
  34. privileged: true
  35. ports:
  36. - "9092:9092"
  37. environment:
  38. KAFKA_BROKER_ID: 2
  39. KAFKA_LISTENERS: PLAINTEXT://broker2:9092
  40. KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker2:9092
  41. KAFKA_ADVERTISED_HOST_NAME: broker2
  42. KAFKA_ADVERTISED_PORT: 9092
  43. KAFKA_ZOOKEEPER_CONNECT: zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
  44. JMX_PORT: 9988
  45. volumes:
  46. - /var/run/docker.sock:/var/run/docker.sock
  47. - ./broker2:/kafka/kafka\-logs\-broker2
  48. external_links: # 连接本compose文件以外的container
  49. - zoo1
  50. - zoo2
  51. - zoo3
  52. networks:
  53. default:
  54. ipv4_address: 172.23.0.15
  55. broker3:
  56. image: wurstmeister/kafka
  57. restart: always
  58. hostname: broker3
  59. container_name: broker3
  60. privileged: true
  61. ports:
  62. - "9093:9092"
  63. environment:
  64. KAFKA_BROKER_ID: 3
  65. KAFKA_LISTENERS: PLAINTEXT://broker3:9092
  66. KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker3:9092
  67. KAFKA_ADVERTISED_HOST_NAME: broker3
  68. KAFKA_ADVERTISED_PORT: 9092
  69. KAFKA_ZOOKEEPER_CONNECT: zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
  70. JMX_PORT: 9988
  71. volumes:
  72. - /var/run/docker.sock:/var/run/docker.sock
  73. - ./broker3:/kafka/kafka\-logs\-broker3
  74. external_links: # 连接本compose文件以外的container
  75. - zoo1
  76. - zoo2
  77. - zoo3
  78. networks:
  79. default:
  80. ipv4_address: 172.23.0.16
  81. kafka-manager:
  82. image: sheepkiller/kafka-manager:latest
  83. restart: always
  84. container_name: kafka-manager
  85. hostname: kafka-manager
  86. ports:
  87. - "9000:9000"
  88. links: # 连接本compose文件创建的container
  89. - broker1
  90. - broker2
  91. - broker3
  92. external_links: # 连接本compose文件以外的container
  93. - zoo1
  94. - zoo2
  95. - zoo3
  96. environment:
  97. ZK_HOSTS: zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
  98. KAFKA_BROKERS: broker1:9092,broker2:9092,broker3:9092
  99. APPLICATION_SECRET: letmein
  100. KM_ARGS: -Djava.net.preferIPv4Stack=true
  101. networks:
  102. default:
  103. ipv4_address: 172.23.0.10
  104. networks:
  105. default:
  106. external: # 使用已创建的网络
  107. name: zoo_kafka

验证#

我们打开kafka-manager的管理页面,访问路径是,宿主机ip:9000;
 


如果所示,填写上Zookeeper集群的地址,划到最下边点击save
点击刚刚添加的集群,可以看到,集群中有三个节点

搭建过程中遇到的问题

  1. 挂载数据卷无限重启,查看log提示:chown: changing ownership of ‘/var/lib/mysql/....‘: Permission denied
    解决方式:
    • 在docker run中加入 --privileged=true 给容器加上特定权限
    • 临时关闭selinux: setenforce 0
    • 添加selinux规则,改变要挂载的目录的安全性文本
  2. kafka-manager报jmx相关错误,
    解决方法:
    • 在每一个kafka节点加上环境变量 JMX_PORT=端口
    • 加上之后发现连不上,又是网络连接的问题,于是又把每个jmx端口暴露出来,然后fire-wall放行, 解决问题。
    • KAFKA_ADVERTISED_HOST_NAME这个最好设置宿主机的ip,宿主机以外的代码或者工具来连接,后面的端口也需要设置暴露的端口。

[error] k.m.j.KafkaJMX$ - Failed to connect to service:jmx:rmi:///jndi/rmi://9.11.8.48:-1/jmxrmi java.lang.IllegalArgumentException: requirement failed: No jmx port but jmx polling enabled!

3.在容器中查看topic时报以下错误(不仅仅是topic的命令,好像所有的都会出错)

 
  1. $ bin/kafka-topics.sh --list --zookeeper zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
  2. # 以下是错误
  3. Error: Exception thrown by the agent : java.rmi.server.ExportException: Port already in use: 7203; nested exception is:
  4. java.net.BindException: Address already in use

解决方法:
在命令前加上unset JMX_PORT;指令,上边的命令改造为:

 

$ unset JMX_PORT;bin/kafka-topics.sh --list --zookeeper zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1

附:Docker常用指令

 

  1. # 查看所有镜像
  2. docker images
  3. # 查看所有运行中的容器
  4. docker ps
  5. # 查看所有容器
  6. docker ps -a
  7. # 获取所有容器ip
  8. $ docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
  9. # 查看容器内部日志
  10. $ docker logs -f <容器ID>
  11. # 进入容器内部
  12. $ docker exec -it <容器ID> /bin/basj
  13. # 创建容器 -d代表后台启动
  14. docker run --name <容器名称> -e <参数> -v <挂载数据卷> <容器ID>
  15. # 重启容器
  16. docker restart <容器ID>
  17. # 关闭容器
  18. docker stop <容器id>
  19. # 运行容器
  20. docker start <容器id>

作者:Jacian

出处:https://www.cnblogs.com/Jacian/p/11421114.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/515012
推荐阅读
相关标签
  

闽ICP备14008679号