本文简要说明了如何在Docker容器中启动和配置Zookeeper。

1 准备工作

1.1 下载zookeeper镜像

$ docker pull zookeeper:3.4

1.2 单点模式

  • 安装Docker CE

1.3 集群模式

  • 安装Docker EE

  • 创建一个名为zk-overlay的network

    $ docker network create -d overlay zk-overlay

2 启动Zookeeper

2.1 单点模式启动

$ docker run --name some-zookeeper --restart always -d zookeeper:3.4

启动后会EXPOSE端口:2181, 2888, 3888。并设置为始终重启。

2.2 集群模式启动

a, 编写集群启动文件zk-stack.yml:
version: '3.1'

services:
zoo1:
image: zookeeper:3.4
networks:
zk-overlay:
aliases:
- zoo1
restart: always
hostname: zoo1
ports:
- 2181:2181
environment:
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888 zoo2:
image: zookeeper:3.4
networks:
zk-overlay:
aliases:
- zoo2
restart: always
hostname: zoo2
ports:
- 2182:2181
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zoo3:2888:3888 zoo3:
image: zookeeper:3.4
networks:
zk-overlay:
aliases:
- zoo3
restart: always
hostname: zoo3
ports:
- 2183:2181
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=0.0.0.0:2888:3888 networks:
zk-overlay:
external:
name: zk-overlay
b, 创建一个overlay网络
$ docker network create --attachable -d overlay zk-overlay

注意要添加参数--attachable,否则之后创建的客户端容器无法加入这个网络。

c, 在Swarm Manager主机上运行
$ docker stack deploy -c zk-stack.yml some-zookeeper

3个zookeeper服务器容器将以swarm的复制模式启动 。端口2181-2183将对外暴露。

c, 查看集群状态

登录到运行Zookeeper容器的主机,查看容器id

$ docker ps | grep zookeeper

# zk容器列表
8d5b86f4bb18 zookeeper:3.4 "/docker-entrypoin..." 3 hours ago Up 3 hours 2888/tcp, 0.0.0.0:2181->2181/tcp, 3888/tcp some-zookeeper_zoo1_1
a614e3211de7 zookeeper:3.4 "/docker-entrypoin..." 3 hours ago Up 3 hours 2888/tcp, 3888/tcp, 0.0.0.0:2182->2181/tcp some-zookeeper_zoo2_1

进入zk容器

$ docker exec -it <container id> bash

查看zk状态

$ zkServer.sh status
# 状态信息
ZooKeeper JMX enabled by default
Using config: /conf/zoo.cfg
Mode: leader # 是显示leader或者follower

3 配置Zookeeper

3.1 配置文件

Zookeeper配置位于/conf。更改它的一种方法是将配置文件作为卷安装:

$ docker run --name some-zookeeper --restart always -d -v $(pwd)/zoo.cfg:/conf/zoo.cfg zookeeper:3.4

3.2 环境变量

如果zoo.cfg未提供文件,则使用ZooKeeper推荐的默认值。可以使用以下环境变量覆盖它们。

$ docker run -e "ZOO_INIT_LIMIT=10" --name some-zookeeper --restart always -d zookeeper:3.4
ZOO_TICK_TIME

默认为2000。zk的tickTime,以毫秒为单位。

ZK中所有时间都是以这个时间单元为基础,进行整数倍配置。

ZOO_INIT_LIMIT

默认为5。zk的initLimit。

Zookeeper等待客户端初始化连接的响应时,最长能等待多少个tickTime。例如默认设置为 5,表示超过5个心跳的时间(也就是ZOO_TICK_TIME)长度后 ,Zookeeper 服务器还没有收到客户端的返回信息,就认为这个客户端连接失败。总的超时时间等于ZOO_INIT_LIMITZOO_TICK_TIME=52000=10000毫秒

ZOO_SYNC_LIMIT

默认为2。zk的syncLimit

Leader 与 Follower 之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime。例如默认设置为2,表示超过2个心跳的时间(也就是ZOO_TICK_TIME)长度后 ,Leader 与 Follower通信超时。

ZOO_MAX_CLIENT_CNXNS

默认为60。zk的maxClientCnxns

单个客户端与单台zk服务器之间的连接数的限制,是ip级别的,如果设置为0,那么表明不作任何限制。

3.3 复制模式

如果要以复制模式运行Zookeeper,则必须使用下面的环境变量。

ZOO_MY_ID

id必须在整体中是唯一的,并且应该具有介于1和255之间的值。请注意,如果使用/data已包含该myid文件的目录启动容器,则此变量不会产生任何影响。

ZOO_SERVERS

此变量允许您指定Zookeeper集合的计算机列表。每个条目都有server.id=host:port:port。参赛作品以空格分隔。请注意,如果使用/conf已包含该zoo.cfg文件的目录启动容器,则此变量不会产生任何影响。

3.4 数据的存储位置

/data和/datalog分别用来保存内存数据库的快照和更新数据库的事务日志。

放置事务日志的位置要考虑对性能的影响。专用的事务日志设备保持良好性能的关键。将日志置于繁忙的设备上会对性能产生负面影响。

生产环境中zookeeper的数据文件需要保证持久性,可通过挂载数据目录到Gluster FS Volume。

4 连接Zookeeper

4.1 单点模式

前提:单点模式启动一个名为some-zookeeper的zookeeper服务器容器。

从一个Zookeeper客户端容器的命令行连接到Zookeeper服务器容器:

$ docker run -it --rm --link some-zookeeper:zookeeper zookeeper:3.4 zkCli.sh -server zookeeper

注意:

  • 参数--link后的some-zookeeper要和zookeeper服务器容器的名称一致;
  • 参数-server zookeeper是固定写法,无需改动。

4.2 集群模式

前提:集群模式启动一组zookeeper服务器容器。

从一个Zookeeper客户端容器的命令行连接到Zookeeper服务器容器:

$ docker run -it --rm --network zk-overlay --link zoo1:zookeeper zookeeper:3.4 zkCli.sh -server zookeeper

注意:

  • 参数--network后的zk-overlay要和zookeeper集群的网络一致;
  • 参数--link后的zoo1,要和集群启动文件中的参数hostname: zoo1保持一致;
  • 参数-server zookeeper是固定写法,无需改动。

容器化系列 - Zookeeper启动和配置 on Docker的更多相关文章

  1. 容器化系列 - GitLab启动和配置 on Docker

    本文简单说明了如何在Docker容器中运行GitLab. 1 准备工作 1.1 下载镜像 $ docker pull docker.io/gitlab/gitlab-ce:latest 1.2 创建持 ...

  2. 容器化系列 - 通过Grafana监测InfluxDB数据 on Docker

    本文演示在Docker中运行Grafana和InfluxDB,并通过Grafana展示InfluxDB曲线图. 1 准备工作 1.1 安装Docker 请参考这里 1.2 下载镜像 $ docker ...

  3. Docker容器化【Dockerfile编写&&搭建与使用Docker私有仓库】

    # Docker 学习目标: 掌握Docker基础知识,能够理解Docker镜像与容器的概念 完成Docker安装与启动 掌握Docker镜像与容器相关命令 掌握Tomcat Nginx 等软件的常用 ...

  4. Flask容器化部署原理与实现

    本文将介绍Flask的部署方案:Flask + Nginx + uWSGI,并使用docker进行容器化部署,部署的实例来源 Flask开发初探,操作系统为ubuntu. Flask系列文章: Fla ...

  5. docker4dotnet #2 容器化主机

    .NET 猿自从认识了小鲸鱼,感觉功力大增.上篇<docker4dotnet #1 前世今生&世界你好>中给大家介绍了如何在Windows上面配置Docker for Window ...

  6. Docker容器化部署Python应用

    1. 简介 Docker是目前主流IT公司广泛接受和使用的,用于构建.管理和保护它们应用程序的工具. 容器,例如Docker允许开发人员在单个操作系统上隔离和运行多个应用程序,而不是为服务器上的每个应 ...

  7. Docker容器化技术(上)

    目录 Docker容器化技术 一.介绍 二.Docker的发展 三.Docker安装 四.阿里云Docker镜像加速 五.Docker的基本概念 六.命令 七.Docker宿主机与容器通信 八.容器内 ...

  8. Docker实践:python应用容器化

    一.前言 容器使用沙箱机制,互相隔离,优势在于让各个部署在容器的里的应用互不影响,独立运行,提供更高的安全性.本文主要介绍python应用(django)跑在docker容器里,编写dockerfil ...

  9. Asp.net容器化

    注意:本文只用于探讨asp.net容器化,不建议生产环境下使用(docker 镜像太大!!!!) 安装docker 准备一个台windwos server 2016 ,在PowerShell 里执行以 ...

随机推荐

  1. [Swift]LeetCode458. 可怜的小猪 | Poor Pigs

    There are 1000 buckets, one and only one of them contains poison, the rest are filled with water. Th ...

  2. [Swift]LeetCode513. 找树左下角的值 | Find Bottom Left Tree Value

    Given a binary tree, find the leftmost value in the last row of the tree. Example 1: Input: 2 / \ 1 ...

  3. Oracle常用语句

    Oracle数据库常用sql语句 ORACLE 常用的SQL语法和数据对象一.数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, ...

  4. 使用(POI)SAX处理Excel大文件,防止内存溢出

    POISAXReader h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-chi ...

  5. Linux(Ubuntu) 下自然码加辅助码双拼输入的解决方案

    Linux(Ubuntu) 下自然码加辅助码双拼输入的解决方案 环境: Ubuntu 14.04 LTS 解决方案是 ibus-Rime 输入法, 再加上搭配自然码的配置表 (1) ibus 首先安装 ...

  6. Spring Data Jpa接口简介

    Repository接口 public interface Repository<T, ID> {....} 提供了按方法名称的查询方式: 提供了@Query的查询方式 可能遇到的错误: ...

  7. 【Spark篇】--Spark中的宽窄依赖和Stage的划分

    一.前述 RDD之间有一系列的依赖关系,依赖关系又分为窄依赖和宽依赖. Spark中的Stage其实就是一组并行的任务,任务是一个个的task . 二.具体细节 窄依赖 父RDD和子RDD parti ...

  8. MVC的App_Code这个特殊文件夹

    对于一个之前编译一点都没有问题的项目,突然间调试就出现了一个报错: 然而你会天真的认为,这个真的是using的问题吗!别傻了,我检查了一遍又一遍: 首先这个是有using的! 其实代码编写上也是没有报 ...

  9. Solr 02 - 最详细的solrconfig.xml配置文件解读

    目录 1 luceneMatchVersion - 指定Lucene版本 2 lib - 配置扩展jar包 3 dataDir - 索引数据路径 4 directoryFactory - 索引存储工厂 ...

  10. SpringBoot入门教程(六)SpringBoot2.0统一处理404,500等http错误跳转页

    在做web项目的时候,大家对404.500等http状态码肯定并不陌生.然而无论是哪种"非正常"状态码,都不是我们想遇到的.尤其像一些500这种服务器内部错误,不愿意展示给用户的, ...