Docker搭建Zookeeper&Kafka集群的实现

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

环境准备

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

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

Docker 安装

如果已经安装Docker请忽略此步骤

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

yum安装

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

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

脚本安装

使用 sudo 或 root 权限登录 Centos。

确保 yum 包更新到最新。

$ sudo yum update

获取并执行 Docker 安装脚本。

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

启动Docker

$ sudo systemctl start docker
# 验证 docker 是否安装成功并在容器中执行一个测试的镜像。
$ 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,需要的话可以将上述目录映射到宿主机。

参数解释

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

集群搭建

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

新建docker网络

$ docker network create zoo_kafka
$ docker network ls

Zookeeper容器1

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

Zookeeper容器2

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

Zookeeper容器3

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

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

docker-compose 搭建zookeeper集群

新建docker网络

$ docker network create viemall-zookeeper
$ docker network ls

编写 docker-compose.yml 脚本

使用方式:

安装 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

任意目录下新建 docker-compose.yml 文件,复制以下内容

执行命令 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详情

version: '2'
services:
 zoo1:
  image: zookeeper:3.4 # 镜像名称
  restart: always # 当发生错误时自动重启
  hostname: zoo1
  container_name: zoo1
  privileged: true
  ports: # 端口
   - 2181:2181
  volumes: # 挂载数据卷
   - ./zoo1/data:/data
   - ./zoo1/datalog:/datalog
  environment:
   TZ: Asia/Shanghai
   ZOO_MY_ID: 1 # 节点ID
   ZOO_PORT: 2181 # zookeeper端口号
   ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 # zookeeper节点列表
  networks:
   default:
    ipv4_address: 172.23.0.11

 zoo2:
  image: zookeeper:3.4
  restart: always
  hostname: zoo2
  container_name: zoo2
  privileged: true
  ports:
   - 2182:2181
  volumes:
   - ./zoo2/data:/data
   - ./zoo2/datalog:/datalog
  environment:
   TZ: Asia/Shanghai
   ZOO_MY_ID: 2
   ZOO_PORT: 2181
   ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
  networks:
   default:
    ipv4_address: 172.23.0.12

 zoo3:
  image: zookeeper:3.4
  restart: always
  hostname: zoo3
  container_name: zoo3
  privileged: true
  ports:
   - 2183:2181
  volumes:
   - ./zoo3/data:/data
   - ./zoo3/datalog:/datalog
  environment:
   TZ: Asia/Shanghai
   ZOO_MY_ID: 3
   ZOO_PORT: 2181
   ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888
  networks:
   default:
    ipv4_address: 172.23.0.13

networks:
 default:
  external:
   name: zoo_kafka

验证

从图中我们可以看出,有一个Leader,两个Flower,至此我们的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 脚本

使用方式:

安装 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

任意目录下新建 docker-compose.yml 文件,复制以下内容

执行命令 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详细内容

version: '2'

services:
 broker1:
  image: wurstmeister/kafka
  restart: always
  hostname: broker1
  container_name: broker1
  privileged: true
  ports:
   - "9091:9092"
  environment:
   KAFKA_BROKER_ID: 1
   KAFKA_LISTENERS: PLAINTEXT://broker1:9092
   KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker1:9092
   KAFKA_ADVERTISED_HOST_NAME: broker1
   KAFKA_ADVERTISED_PORT: 9092
   KAFKA_ZOOKEEPER_CONNECT: zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
   JMX_PORT: 9988
  volumes:
   - /var/run/docker.sock:/var/run/docker.sock
   - ./broker1:/kafka/kafka\-logs\-broker1
  external_links:
  - zoo1
  - zoo2
  - zoo3
  networks:
   default:
    ipv4_address: 172.23.0.14

 broker2:
  image: wurstmeister/kafka
  restart: always
  hostname: broker2
  container_name: broker2
  privileged: true
  ports:
   - "9092:9092"
  environment:
   KAFKA_BROKER_ID: 2
   KAFKA_LISTENERS: PLAINTEXT://broker2:9092
   KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker2:9092
   KAFKA_ADVERTISED_HOST_NAME: broker2
   KAFKA_ADVERTISED_PORT: 9092
   KAFKA_ZOOKEEPER_CONNECT: zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
   JMX_PORT: 9988
  volumes:
   - /var/run/docker.sock:/var/run/docker.sock
   - ./broker2:/kafka/kafka\-logs\-broker2
  external_links: # 连接本compose文件以外的container
  - zoo1
  - zoo2
  - zoo3
  networks:
   default:
    ipv4_address: 172.23.0.15

 broker3:
  image: wurstmeister/kafka
  restart: always
  hostname: broker3
  container_name: broker3
  privileged: true
  ports:
   - "9093:9092"
  environment:
   KAFKA_BROKER_ID: 3
   KAFKA_LISTENERS: PLAINTEXT://broker3:9092
   KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker3:9092
   KAFKA_ADVERTISED_HOST_NAME: broker3
   KAFKA_ADVERTISED_PORT: 9092
   KAFKA_ZOOKEEPER_CONNECT: zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
   JMX_PORT: 9988
  volumes:
   - /var/run/docker.sock:/var/run/docker.sock
   - ./broker3:/kafka/kafka\-logs\-broker3
  external_links: # 连接本compose文件以外的container
  - zoo1
  - zoo2
  - zoo3
  networks:
   default:
    ipv4_address: 172.23.0.16

 kafka-manager:
  image: sheepkiller/kafka-manager:latest
  restart: always
  container_name: kafka-manager
  hostname: kafka-manager
  ports:
   - "9000:9000"
  links:      # 连接本compose文件创建的container
   - broker1
   - broker2
   - broker3
  external_links:  # 连接本compose文件以外的container
   - zoo1
   - zoo2
   - zoo3
  environment:
   ZK_HOSTS: zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
   KAFKA_BROKERS: broker1:9092,broker2:9092,broker3:9092
   APPLICATION_SECRET: letmein
   KM_ARGS: -Djava.net.preferIPv4Stack=true
  networks:
   default:
    ipv4_address: 172.23.0.10

networks:
 default:
  external:  # 使用已创建的网络
   name: zoo_kafka

验证

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

如果所示,填写上Zookeeper集群的地址,划到最下边点击save

点击刚刚添加的集群,可以看到,集群中有三个节点

搭建过程中遇到的问题

挂载数据卷无限重启,查看log提示:chown: changing ownership of ‘/var/lib/mysql/....‘: Permission denied

解决方式:

  • 在docker run中加入 --privileged=true 给容器加上特定权限
  • 临时关闭selinux: setenforce 0
  • 添加selinux规则,改变要挂载的目录的安全性文本

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!

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

$ bin/kafka-topics.sh --list --zookeeper zoo1:2181/kafka1,zoo2:2181/kafka1,zoo3:2181/kafka1
# 以下是错误
Error: Exception thrown by the agent : java.rmi.server.ExportException: Port already in use: 7203; nested exception is:
    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常用指令

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Docker + Nodejs + Kafka + Redis + MySQL搭建简单秒杀环境

    秒杀活动可以说在互联网上随处可见,从12306抢票,到聚划算抢购,我们生活的方方面面都可以看到秒杀的身影.秒杀的架构设计也是对于一个架构师架构设计能力的一次考验.本文的目的并不在于提供一个可以直接落地的设计方案,而是意在提供一个简单的方法,一个思路,使大家能够对于秒杀背后的一些设计有更感性的认识, 并且可以自己亲自动手实践一下.所有的配置及源码都在本文最后的GitHub repository中可以找到. 首先,先简单介绍下本文中会涉及到的一些组件,如下图所示: JMeter:用JMeter来模拟

  • 详解使用docker搭建kafka环境

    Requirements 最近学习了下kafka,为方便搭建环境,使用docker进行部署. 需要首先安装docker的环境.要求操作系统是linux的64位系统. docker的安装(适于rpm/deb安装): curl -fsSL https://get.docker.com/ | sh docker-compose的安装: curl -L https://github.com/docker/compose/releases/download/1.7.0/docker-compose-`un

  • Docker搭建Zookeeper&Kafka集群的实现

    最近在学习Kafka,准备测试集群状态的时候感觉无论是开三台虚拟机或者在一台虚拟机开辟三个不同的端口号都太麻烦了(嗯..主要是懒). 环境准备 一台可以上网且有CentOS7虚拟机的电脑 为什么使用虚拟机?因为使用的笔记本,所以每次连接网络IP都会改变,还要总是修改配置文件的,过于繁琐,不方便测试.(通过Docker虚拟网络的方式可以避免此问题,当时实验的时候没有了解到) Docker 安装 如果已经安装Docker请忽略此步骤 Docker支持以下的CentOS版本: CentOS 7 (64

  • 详解使用docker搭建hadoop分布式集群

    使用Docker搭建部署Hadoop分布式集群 在网上找了很长时间都没有找到使用docker搭建hadoop分布式集群的文档,没办法,只能自己写一个了. 一:环境准备: 1:首先要有一个Centos7操作系统,可以在虚拟机中安装. 2:在centos7中安装docker,docker的版本为1.8.2 安装步骤如下: <1>安装制定版本的docker yum install -y docker-1.8.2-10.el7.centos <2>安装的时候可能会报错,需要删除这个依赖 r

  • 基于Docker搭建Redis主从集群的实现

    最近陆陆续续有不少园友加我好友咨询 redis 集群搭建的问题,我觉得一定是之前写的这篇 <基于Docker的Redis集群搭建> 文章有问题了,所以我花了几分钟浏览之前的文章总结了下面几个问题: redis 数量太少,只创建了 3 个实例:由于只有 3 个实例,所以全部只能是主节点,无法体现集群主从关系:如何搭建主从集群?如何分配从节点? 基于之前的文章,我想快速的过一下这几个问题,本文基于 Docker + Redis 5.0.5 版本,通过 cluster 方式创建一个 6 个 redi

  • docker搭建redis哨兵集群并且整合springboot的实现

    目录 1.创建两个文件夹redis和sentinel文件夹用于存放docker-compose.yml文件 2.redis下的docker-compose.yml 3.sentinel下的docker-compose.yml文件以及sentinel.conf配置文件 4.spring boot整合redis哨兵 5.哨兵工作方式 6.Redis-Cluster集群 7.redis常见问题 1.创建两个文件夹redis和sentinel文件夹用于存放docker-compose.yml文件 2.r

  • Docker容器搭建Kafka集群的详细过程

    目录 一.Kafka集群的搭建 1.拉取相关镜像 2.运行zookeeper 3.运行kafka 4.设置topic 5.进行生产者和消费者测试 一.Kafka集群的搭建 1.拉取相关镜像 docker pull wurstmeister/kafka docker pull zookeeper 2.运行zookeeper docker run -d --name zookeeper -p 2181:2181 -t zookeeper 3.运行kafka Kafka0: docker run -d

  • docker搭建kafka集群的方法实现

    目录 一.原生Docker命令 二.镜像选择 三.集群规划 四.Zookeeper集群安装 五.Kafka集群安装 一.原生Docker命令 1. 删除所有dangling数据卷(即无用的Volume,僵尸文件) docker volume rm $(docker volume ls -qf dangling=true) 2. 删除所有dangling镜像(即无tag的镜像) docker rmi $(docker images | grep "^<none>" | awk

  • docker搭建Zookeeper集群的方法步骤

    目录 0.前言 1.前提 2.开始搭建 解释 创建zoo.cfg 3.docker搭建 1.docker创建网络 2.启动第1个zk节点 3.启动第2个zk节点 4.启动第3个zk节点 4.访问节点 1.进入zk第一个节点的docker容器内部 2.使用zk的客户端进行访问 3.在zk中使用命令 0.前言 之前在学springcloud的时候,提到有些项目还是使用zookeeper作为注册中心. 因此决定掌握这个技能,但是本地为了测试而部署一套zookeeper集群还是比较麻烦的. 所以打算使用

  • Docker上实现Redis集群搭建

    环境:Docker + ( Redis:5.0.5 * 3 ) 1.拉取镜像 docker pull redis:5.0.5 2.创建Redis容器 创建三个 redis 容器: redis-node1:6379 redis-node2:6380 redis-node3:6381 docker create --name redis-node1 -v /data/redis-data/node1:/data -p 6379:6379 redis:5.0.5 --cluster-enabled y

  • Hadoop+HBase+ZooKeeper分布式集群环境搭建步骤

    目录 一.环境说明 2.1 安装JDK 2.2 添加Hosts映射关系 2.3 集群之间SSH无密码登陆 三.Hadoop集群安装配置 3.1 修改hadoop配置 3.2 启动hadoop集群 四.ZooKeeper集群安装配置 4.1 修改配置文件zoo.cfg 4.2 新建并编辑myid文件 4.3 启动ZooKeeper集群 五.HBase集群安装配置 5.1 hbase-env.sh 5.2 hbase-site.xml 5.3 更改 regionservers 5.4 分发并同步安装

  • docker网络及部署集群和打包镜像问题

    目录 Docker 网络 理解Docker –-link 自定义网络 网络连通 实战:部署Redis集群 SpringBoot微服务打包Docker镜像 Docker 网络 理解Docker 清空下前面的docker 镜像.容器 # 删除全部容器 $ docker rm -f $(docker ps -aq) # 删除全部镜像 $ docker rmi -f $(docker images -aq) 测试 三个网络 问题: docker 是如果处理容器网络访问的? # 测试 运行一个tomcat

随机推荐