Docker部署Consul集群
服务介绍
Consul是一种分布式、高可用、支持水平扩展的服务注册与发现工具。包含的特性有:服务发现、健康检查、键值存储、多数据中心和服务管理页面等。
官方架构设计图:

图中包含两个Consul数据中心(即两个Consul集群)。数据中心1由多个SERVER和CLIENT组成,数据中心2由多个CLIENT组成。对于Consul集群而言,SERVER或CLIENT都是集群的一个节点,服务可注册到任意节点上,从而实现注册信息共享。
# CLIENT
表示consul的client模式,所有注册到当前节点的服务会被转发到SERVER,本身不持久化数据。其职责是健康检查、服务注册等,当服务数量特别庞大时,分别启动多个client可减少server压力。
# SERVER
表示consul的server模式,功能和CLIENT都一样,区别是它能把所有信息持久化到本地,遇到故障时,信息是可以被保留的。
# LEADER
图中中间SERVER带有LEADER标识,说明在多个SERVER中,其为老大。它负责各个节点的健康检查和同步注册信息给其他SERVER。
官方文档:https://www.consul.io/intro/index.html
部署操作
配置参数
-bootstrap-expect
--配置数据中心中预期的SERVER的数量,当集群中启动的SERVER达到预期值时,Consul开始引导集群;
-bind
--内部集群通信绑定的地址,默认情况下是"0.0.0.0";
-client
--consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0;
-config-file
--服务启动时要加载的配置文件;
-config-dir
--配置文件目录;
-config-format
--指定要加载的配置文件的格式;
-data-dir
--数据目录;
-dev
--启用开发服务器模式。对于在关闭所有持久性选项的情况下快速启动consul代理非常有用,不适合生产使用,因为它不将任何数据写入磁盘;
-join
--启动时要加入到的另一位代理地址;
-retry-join
--加入失败后重试连接,对于明确可用地址的情况下很有用;
更多详细参数见: https://www.consul.io/docs/agent/options.html
实验环境
笔者在做此实验之前,也查找了许多资料及部署方式,网上很多资源都是在物理机上常规(非docker方式)部署consul集群或者一台服务器上部署整个consul集群。而在生产环境中,出于数据安全及冗余等问题,将consul集群采用docker方式分布式部署在多台服务器上,方案尤佳,此实验将采用此方式操作!
此实验前提条件是所有服务器都有可用的DOCKER运行环境!官方概述说SERVER节点最好是3~5个,此实验将部署3个server(因server和client的区别就在于数据的持久化差异,同时又涉及到集群故障处理等操作实现,又因资源因素,此实验不部署client),规划如下:
192.168.10.11 SERVER1,选为LEADER
192.168.10.12 SERVER2
192.168.10.13 SERVER3
192.168.10.14 REGISTRY
操作步骤
--net=host
--将容器需要映射的端口全部映射到物理机上,并且端口保持不变;
# SERVER1上操作
[root@11 ~]# docker run -d --name=consul --net=host -e CONSUL_BIND_INTERFACE=eth0 consul agent -server=true -client=0.0.0.0 -bind=192.168.10.11 -ui -bootstrap-expect=2
# 参数说明
1、eth0代表服务器卡网,也可能是ens33,ens160等,根据服务器信息传入相应参数即可;
2、通过bind本机ip,改变了consul服务对外的ip地址,默认是172.17.0.2;查看命令是 docker inspect --format '{{ .NetworkSettings.IPAddress }}' consul1 ,consul1是对应的容器名称;
3、当需要指定配置文件和数据目录时,可用如下命令启动:
docker run -d --name=consul1 -v /consulconfig:/config/file -config-dir=/config/file -date-dir=/tmp/consul --net=host -e CONSUL_BIND_INTERFACE=eth0 consul agent -server=true -client=0.0.0.0 -bind=192.168.10.11 -ui -bootstrap-expect=2
# 查看日志
# 此时集群consul服务未达到预期的数量,会出现报错(继续完成其他节点的部署将解决),如下:
[root@11 ~]# docker logs -f consul

# SERVER2、SERVER3上分别操作
# docker run -d --name=consul --net=host -e CONSUL_BIND_INTERFACE=eth0 consul agent -server -client=0.0.0.0 -ui -bootstrap-expect=2 -retry-join=192.168.10.11
# 此时登陆管理页面,可查看到如下效果

# CLINET上操作(普及client部署命令,此实验未有此步骤,可忽略!)
[root@13 ~]# docker run -d --name=consul3 --net=host -e CONSUL_BIND_INTERFACE=eth0 consul agent -client=0.0.0.0 -retry-join=192.168.10.11
# 查看集群成员
docker exec -t consul consul members # 第一个consul为容器名称;

# 查看投票状态
docker exec -t consul consul operator raft list-peers

官方文档:https://hub.docker.com/_/consul
服务注册
将容器中运行的服务注册到Consul中,可以通过调用API和其他软件进行操作,此处将介绍开源软件Registrator对服务进行注册操作。
# 重点申明
当服务器上的docker容器通过--net=host方式映射端口时,容器信息无法自动注册到consul中,故请通过-p参数实现端口映射!
# REGISTRY服务器上操作
# 启动Registrator
docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
-ip=192.168.10.16 \
consul://192.168.10.12:8500
# 参数说明
-ip是本机ip地址;
consul://192.168.10.12:8500是任意一台server地址(11,12,13都可);
# 运行测试docker
[root@kazihuo ~]# docker run -itd -p 81:80 nginx
# 页面查看

官方地址:https://gliderlabs.com/registrator/latest/
故障模拟
此集群有3个server,而其期望值的数量是2,当集群中有一台server故障时,将自动选取新的leader,操作如下:
# SERVER1上停掉consul server;
[root@11 ~]# docker stop consul
# 在另外2台server上任意一台查看集群状态;
# 此时集群中选取了新leader;
# docker exec -t consul consul members

# docker exec -t consul consul operator raft list-peers

Docker部署Consul集群的更多相关文章
- Docker 容器部署 Consul 集群
Docker 容器部署 Consul 集群 一.docker安装与启动1.1安装docker[root@localhost /]# yum -y install docker-io 1.2更改配置文件 ...
- Docker部署Elasticsearch集群
http://blog.sina.com.cn/s/blog_8ea8e9d50102wwik.html Docker部署Elasticsearch集群 参考文档: https://hub.docke ...
- 庐山真面目之十二微服务架构基于Docker搭建Consul集群、Ocelot网关集群和IdentityServer版本实现
庐山真面目之十二微服务架构基于Docker搭建Consul集群.Ocelot网关集群和IdentityServer版本实现 一.简介 在第七篇文章<庐山真面目之七微服务架构Consul ...
- Docker部署Hadoop集群
Docker部署Hadoop集群 2016-09-27 杜亦舒 前几天写了文章"Hadoop 集群搭建"之后,一个朋友留言说希望介绍下如何使用Docker部署,这个建议很好,Doc ...
- Docker安装Consul集群
Docker 安装Consul集群 使用windows 环境,Docker desktop community 构建consul集群. 1.docker 容器网络 docker安装后,默认会创建三种网 ...
- 基于Docker部署ETCD集群
基于Docker部署ETCD集群 关于ETCD要不要使用TLS? 首先TLS的目的是为了鉴权为了防止别人任意的连接上你的etcd集群.其实意思就是说如果你要放到公网上的ETCD集群,并开放端口,我建议 ...
- Docker部署zookeeper集群和kafka集群,实现互联
本文介绍在单机上通过docker部署zookeeper集群和kafka集群的可操作方案. 0.准备工作 创建zk目录,在该目录下创建生成zookeeper集群和kafka集群的yml文件,以及用于在该 ...
- vagrant+docker搭建consul集群开发环境
HashiCorp 公司推出的Consul是一款分布式高可用服务治理与服务配置的工具.关于其配置与使用可以参考这篇文章 consul 简介与配置说明. 一般,我们会在多台主机上安装并启动 consul ...
- RabbitMQ系列(五)使用Docker部署RabbitMQ集群
概述 本文重点介绍的Docker的使用,以及如何部署RabbitMQ集群,最基础的Docker安装,本文不做过多的描述,读者可以自行度娘. Windows10上Docker的安装 因为本人用的是Win ...
随机推荐
- scipy线性模块liner(linalg)
#liner import numpy as np from scipy import linalg as lg arr=np.array([[1,1],[0,1]]) matr=np.mat('[1 ...
- c3算法详解
c3 算法求某一类在多继承中的继承顺序:类的mro == [类] + [父类的继承顺序] + [父类2的继承顺序]如果从左到右的第一个类在后面的顺序中出现,那么就提取出来到mro顺序中[ABCD] + ...
- python学习笔记六——堆栈和队列
4.2.3 列表的查找.排序.反转 list列表可以进行添加.删除操作,此外List列表还提供了查找元素的方法.list列表的查找提供了两种方式,一种是使用index方法返回元素在列表中的位置,另一种 ...
- BZOJ1070[SCOI2007]修车——最小费用最大流
题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待 ...
- matplotlib极坐标方法详解
一.极坐标 在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向).对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到 ...
- git上传到码云
touch README.md git init git add README.md git add "你的文件" git commit -m "first commit ...
- 【ZOJ2277】The Gate to Freedom
BUPT2017 wintertraining(16) #4 E ZOJ - 2277 题意 输出\(n^n\)的首位的数字. 题解 用科学计数法表示\(n^n=k\cdot 10^b\),那么\(n ...
- .htaccess 配置
常规wordpress配置 <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ ...
- 学习Spring Boot:(二十五)使用 Redis 实现数据缓存
前言 由于 Ehcache 存在于单个 java 程序的进程中,无法满足多个程序分布式的情况,需要将多个服务器的缓存集中起来进行管理,需要一个缓存的寄存器,这里使用的是 Redis. 正文 当应用程序 ...
- 【BZOJ4712】洪水(动态dp)
[BZOJ4712]洪水(动态dp) 题面 BZOJ 然而是权限题QwQ,所以粘过来算了. Description 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开 ...