consul:高可用,分布式的服务发现的工具html
master主机—docker01:172.16.1.30
node01主机—docker02:172.16.1.31
node02主机—docker03:172.16.1.32node
注意:由于是测试环境,因此暂时关闭防火墙,禁用selinux,若是是对外网发布的服务器,是不能够关闭防火墙,能够设置iptables规则。linux
(1)docker01上部署consul:
下载或上传consul_1.5.1_linux_amd64软件包:nginx
[root@sqm-docker01 ~]# unzip consul_1.5.1_linux_amd64.zip #使用unzip工具进行一个解压 [root@sqm-docker01 ~]# mv consul /usr/local/bin/ [root@sqm-docker01 ~]# chmod +x /usr/local/bin/consul
[root@sqm-docker01 ~]# consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data \ > -bind=172.16.1.30 \ #docker01本机的ip地址 > -client=0.0.0.0 \ > -node=master
参数解释:
-server:添加一个服务
-bootstrap:通常在server单节点的时候使用,自选举为leader。
-data-dir:指定数据存放的目录
-ui:开启内部的web界面
-bind:指定开启服务的ip
-client:指定服务的客户端
-node:在集群内部通讯使用的名称,默认是主机名。git
####保持后台运行consul服务:[root@sqm-docker01 ~]# nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=172.16.1.30 -client=0.0.0.0 -node=master &
github
执行后台运行后,会在当前目录下生成一个文件,生成全部的集群信息都会保存在这个文件内:
##查看服务端口是否运行:web
8300: 集群节点(对外公布的)
8301: 集群内部访问
8302: 跨数据中心之间的通讯
8500: http--UI
8600: dns算法
##查看consul信息:[root@sqm-docker01 ~]# consul info
docker
说明:consul信息中多为一些算法,这些算法保证数据的同步,以及加上-bootstrap自选举为leader,也是经过这些算法来实现的。
bootstrap
##查看集群内部信息:[root@sqm-docker01 ~]# consul members
登录访问web界面:http://172.16.1.30:8500
(2)docker02上操做:
部署consul服务:
下载progrium/consul镜像:[root@sqm-docker02 ~]# docker pull myprogrium-consul
##建立一个consul容器,而且加入consul集群中:[root@sqm-docker02 ~]# docker run -d --name consul -p 8301:8301 -p 8301:8301/udp -p 8500:8500 -p 8600:8600 -p 8600:8600/udp --restart=always progrium/consul -join 172.16.1.30 -advertise 172.16.1.31 -client 0.0.0.0 -node=node01
解释:
-join:加入的是docker01的集群,因此指定的是docker01的主机地址
-advertise:通告的是本机(docker02)的地址,
-client:表示因此主机访问该节点
-node:自定义节点名称为node01
确保容器已正常运行:
在网页上查看该节点是否加入:
(3)在docker03上操做:
一样的下载progrium/consul镜像:[root@sqm-docker02 ~]# docker pull myprogrium-consul
运行容器并加入集群:[root@sqm-docker03 ~]# docker run -d --name consul -p 8301:8301 -p 8301:8301/udp -p 8500:8500 -p 8600:8600 -p 8600:8600/udp --restart=always progrium/consul -join 172.16.1.30 -advertise 172.16.1.32 -client 0.0.0.0 -node=node02
#注意须要通告的是自身的ip地址,节点名称为node02
加入集群后,在docker01上查看集群信息:
[root@sqm-docker01 ~]# consul members
浏览web界面查看:
确保node1和node2都已经加入到了集群中
(4)在docker01上安装consul-template:
该软件包能够在github上进行下载,下载路径(可自定义选择版本):https://releases.hashicorp.com/consul-template/
下载后解压,并给予执行权限:
[root@sqm-docker01 ~]# unzip consul-template_0.19.5_linux_amd64.zip Archive: consul-template_0.19.5_linux_amd64.zip inflating: consul-template [root@sqm-docker01 ~]# mv consul-template /usr/local/bin/ [root@sqm-docker01 ~]# chmod +x /usr/local/bin/consul-template
暂时先安装完,不作其余操做。
(5)部署registrator:
主要用来收集容器运行服务的信息,而且发送给consul。
自动发现docker container提供的服务,而且在后端服务注册中心(数据中心)注册服务。
常见的数据中心有:consul,etcd,zookeeper,相关的技术能够查找相关的技术文档。
注意:#两台都要部署
docker02:
我导入了一个本地下载好的镜像(在pull进行拉取):[root@sqm-docker02 ~]# docker load --input myregistrator.tar
运行一个registrator容器:[root@sqm-docker02 ~]# docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator consul://172.16.1.31:8500
以上命令的做用是把收集过来容器的信息给本机的8500端口来显示
访问web网页查看是否收集到容器的信息:
url:http://172.16.1.30:8500/
如今在docker02上运行一个ngnx服务,测试是否可以发现:[root@sqm-docker02 ~]# docker run -d -P --name test nginx
docker03:
执行在docker02一样的操做,查看是否可以发现服务:
下载镜像并建立容器:
[root@sqm-docker03 ~]# docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator consul://172.16.1.32:8500
运行nginx服务:[root@sqm-docker03 ~]# docker run -d --name test2 -P nginx
确保容器正常运行:
web网页进行查看:
确保也可以收集到node2上的nginx容器信息。
(6)在docker01上部署nginx,提供反向代理:
1)安装nginx:
安装依赖:[root@sqm-docker01 ~]# yum -y install gcc pcre pcre-devel openssl openssl-devel zlib zlib-devel
建立nginx用户[root@sqm-docker01 ~]# useradd -M -s /usr/sbin/nologin nginx
编译安装:
[root@sqm-docker01 ~]# tar zxf nginx-1.14.0.tar.gz -C /usr/src/ [root@sqm-docker01 ~]# cd /usr/src/nginx-1.14.0/ [root@sqm-docker01 nginx-1.14.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_realip_module --with-pcre --with-http_ssl_module && make && make install
软连接:[root@sqm-docker01 ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
启动nginx:[root@sqm-docker01 ~]# nginx
2)如今就开始部署刚才安装完的consul-template插件了
consul-template的做用:把收集到的信息(把registrator收集到容器的信息)写入template模板中,而且最终写入nginx的配置文件中,经过该模板来实现自动化。
##编写consul-template网页:
[root@sqm-docker01 ~]# cd /usr/local/nginx/ [root@sqm-docker01 nginx]# mkdir consul #在nginx目录下建立存放template网页的目录 [root@sqm-docker01 nginx]# cd consul/ [root@sqm-docker01 consul]# vim nginx.ctmpl
内容以下(以go语言实现):
upstream http_backend { {{range service "nginx"}} server {{.Address}}:{{.Port}}; {{ end }} } server { listen 8000; #监听端口能够自定义,只要不与本身的80端口冲突便可 server_name localhost; location / { proxy_pass http://http_backend; } }
##修改nginx配置文件:[root@sqm-docker01 consul]# vim /usr/local/nginx/conf/nginx.conf
//根据刚才的模板生成一个.conf文件:
[root@sqm-docker01 consul]# consul-template -consul-addr 172.16.1.30:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/sbin/nginx -s reload"
注意:执行命令回车后将会卡在终端,因此接下来咱们另开一个终端查看。
也能够将其设置为后台运行:(加上nohup和&参数):[root@sqm-docker01 consul]# nohup consul-template -consul-addr 172.16.1.30:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/sbin/nginx -s reload" &
##能看到vhost文件中有node01和node02的地址及端口号,说明nginx代理成功。
(7)实现服务自动发现:
为了验证明现服务发现,在docker02和docker03上建立容器:(基于nginx服务运行)
操做命令以下:
docker02:
mkdir html echo docker02_web01 > html/index.conf docker run -itd --name web01 -v /root/html:/usr/share/nginx/html -P nginx
为了更直观的看到,咱们运行第二个nginx容器:
docker run -itd --name web02 -P nginx:latest docker exec -it web02 /bin/bash echo docker02_web02 > /usr/share/nginx/html/index.html
docker03:(一样的建立两个容器):
docker run -itd --name web03 -P nginx:latest docker exec -it web03 /bin/bash echo docker03-web01 > /usr/share/nginx/html/index.html
docker run -itd --name web04 -P nginx:latest docker exec -it web04 /bin/bash echo docker03-web02 > /usr/share/nginx/html/index.htm
最后验证自动发现的nginx页面:
访问的是代理nginx服务器的地址跟上自定义的访问端口8000
URL:http://172.16.1.30:8000/
第一次访问的页面是代理服务器自身的nginx页面:
第二次访问到的是docker02上的第一个nginx页面:
第三次访问到的是docker02上的第二个nginx页面:
docker03上的nginx1页面:
docker03上的nignx2页面:
至此在Docker上部署集群,实现服务的一个自动发现,已经搭建并测试完毕。。。。。
———————— 本文至此结束,感谢阅读 ————————