Consul+Registrator+Docker实现服务发现(nginx反向代理)

环境准备:

consul:高可用,分布式的服务发现的工具

master主机—docker01:172.16.1.30
node01主机—docker02:172.16.1.31
node02主机—docker03:172.16.1.32

注意:因为是测试环境,所以暂时关闭防火墙,禁用selinux,如果是对外网发布的服务器,是不可以关闭防火墙,可以设置iptables规则。

项目操作:

(1)docker01上部署consul:
下载或上传consul_1.5.1_linux_amd64软件包:

[[email protected] ~]# unzip consul_1.5.1_linux_amd64.zip  #使用unzip工具进行一个解压
[[email protected] ~]# mv consul /usr/local/bin/
[[email protected] ~]# chmod +x /usr/local/bin/consul
[[email protected] ~]# 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:在集群内部通信使用的名称,默认是主机名。

####保持后台运行consul服务:
[[email protected]qm-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 &


执行后台运行后,会在当前目录下生成一个文件,生成所有的集群信息都会保存在这个文件内:

##查看服务端口是否运行:

8300: 集群节点(对外公布的)
8301: 集群内部访问
8302: 跨数据中心之间的通信
8500: http--UI
8600: dns

##查看consul信息:
[[email protected] ~]# consul info

说明:consul信息中多为一些算法,这些算法保证数据的同步,以及加上-bootstrap自选举为leader,也是通过这些算法来实现的。

##查看集群内部信息:
[[email protected] ~]# consul members

登陆访问web界面:http://172.16.1.30:8500

(2)docker02上操作:

部署consul服务:
下载progrium/consul镜像:
[[email protected] ~]# docker pull myprogrium-consul

##创建一个consul容器,并且加入consul集群中:
[[email protected] ~]# 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镜像:
[[email protected] ~]# docker pull myprogrium-consul
运行容器并加入集群:
[[email protected] ~]# 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上查看集群信息:

[[email protected] ~]# consul members

浏览web界面查看:

确保node1和node2都已经加入到了集群中

(4)在docker01上安装consul-template:
该软件包可以在github上进行下载,下载路径(可自定义选择版本):https://releases.hashicorp.com/consul-template/

下载后解压,并给予执行权限:

[[email protected] ~]# unzip consul-template_0.19.5_linux_amd64.zip
Archive:  consul-template_0.19.5_linux_amd64.zip
  inflating: consul-template
[[email protected] ~]# mv consul-template /usr/local/bin/
[[email protected] ~]# chmod +x /usr/local/bin/consul-template

暂时先安装完,不做其他操作。

(5)部署registrator:

主要用来收集容器运行服务的信息,并且发送给consul。
自动发现docker container提供的服务,并且在后端服务注册中心(数据中心)注册服务。
常见的数据中心有:consul,etcd,zookeeper,相关的技术可以查找相关的技术文档。

在docker02和docker03上部署registrator:

注意:#两台都要部署

docker02:
我导入了一个本地下载好的镜像(在pull进行拉取):
[[email protected] ~]# docker load --input myregistrator.tar

运行一个registrator容器:
[[email protected] ~]# 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服务,测试是否能够发现:
[[email protected] ~]# docker run -d -P --name test nginx

docker03:
执行在docker02同样的操作,查看是否能够发现服务:

下载镜像并创建容器:
[[email protected] ~]# docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator consul://172.16.1.32:8500

运行nginx服务:
[[email protected] ~]# docker run -d --name test2 -P nginx

确保容器正常运行:

web网页进行查看:

确保也能够收集到node2上的nginx容器信息。

(6)在docker01上部署nginx,提供反向代理:
1)安装nginx:

安装依赖:
[[email protected] ~]# yum -y install gcc pcre pcre-devel openssl openssl-devel zlib zlib-devel
创建nginx用户
[[email protected] ~]# useradd -M -s /usr/sbin/nologin nginx
编译安装:

[[email protected] ~]# tar zxf nginx-1.14.0.tar.gz  -C /usr/src/
[[email protected] ~]# cd /usr/src/nginx-1.14.0/
[[email protected] 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

软链接:
[[email protected] ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

启动nginx:
[[email protected] ~]# nginx

2)现在就开始部署刚才安装完的consul-template插件了

consul-template的作用:把收集到的信息(把registrator收集到容器的信息)写入template模板中,并且最终写入nginx的配置文件中,通过该模板来实现自动化。

##编写consul-template网页:

[[email protected] ~]# cd /usr/local/nginx/
[[email protected] nginx]# mkdir consul  #在nginx目录下创建存放template网页的目录
[[email protected] nginx]# cd consul/
[[email protected] 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配置文件:
[[email protected] consul]# vim /usr/local/nginx/conf/nginx.conf

//根据刚才的模板生成一个.conf文件:

[[email protected] 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和&参数):
[[email protected] 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上部署集群,实现服务的一个自动发现,已经搭建并测试完毕。。。。。

———————— 本文至此结束,感谢阅读 ————————

原文地址:https://blog.51cto.com/13972012/2446086

时间: 2024-10-22 16:12:48

Consul+Registrator+Docker实现服务发现(nginx反向代理)的相关文章

ubuntu 16.04利用docker搭建java+tomcat+nginx反向代理/动静分离

ubuntu 16.04利用docker搭建java+tomcat+nginx反向代理 新建两个docker容器 docker run -it --name Tomcat-mysql -v /mnt:/mnt -p 8866:80 -p 33006:3306 ubuntu /bin/bash docker run -itd --name webserver -p 8888:80 -v /mnt/:/mnt/ ubuntu /bin/bash [email protected]:~# docker

Web服务之Nginx反向代理与负载均衡

一.代理 正向代理: 正向代理是一个位于客户端和目标服务器之间的服务器,为了从目标服务器取得内容,客户端向代理发送一个请求并指定目标服务器,然后代理向目标服务器转交请求并将获得的内容返回给客户端.客户端必须要进行一些特别的设置才能使用正向代理. 作用: 访问无法访问的服务器(翻墙,懂得) 加速访问目标服务器(链路加速) Cache缓存(访问加速) 实现客户端访问授权 隐藏访问者 反向代理: 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转

nginx服务,nginx反向代理

(一)nginx 同apapche功能一样,基于http协议传输,提供web服务,用于搭建linux的web服务器. 1.安装过程: (1)安装扩展源epel,有的话可不用安装: -----yum clean all -----yum install epel-release -y (2)安装nginx ----yum install nginx -y (3)写配置文件(写的配置以分号结尾) -----vim /etc/nginx/nginx.conf 默认关键配置项: root  /usr/s

在Linux系统下使用Docker以及Weave搭建Nginx反向代理

Hi, 今天我们将会学习如何使用 Weave 和 Docker 搭建 Nginx 的反向代理/负载均衡服务器.Weave 可以创建一个虚拟网络将 Docker 容器彼此连接在一起,支持跨主机部署及自动发现.它可以让我们更加专注于应用的开发,而不是基础架构.Weave 提供了一个如此棒的环境,仿佛它的所有容器都属于同个网络,不需要端口/映射/连接等的配置.容器中的应用提供的服务在 weave 网络中可以轻易地被外部世界访问,不论你的容器运行在哪里.在这个教程里我们将会使用 weave 快速并且简单

【Linux】采用nginx反向代理让websocket 支持 wss

背景:玩swoole 服务 使用Nginx反向代理解决wss问题. 即客户端通过wss协议连接 Nginx 然后 Nginx 通过ws协议和server通讯. 也就是说Nginx负责通讯加解密,Nginx到server是明文的,swoole 服务不用开启ssl,而且还能隐藏服务器端口和负载均衡(何乐不为). server { # 下面这个部分和你https的配置没有什么区别,如果你是 宝塔 或者是 oneinstack 这里用生成的也是没有任何问题的 listen 443; server_nam

linux-nginx服务nfs服务nginx反向代理三台web

一:nginx服务 1.二进制安装nginx包 [[email protected] ~]# systemctl disable firewalld  #关闭Firewalls自启动 Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service. [[ema

Nginx反向代理https服务

背景: 最近因工作需要,需在web前端做一个代理,来解决部分用户不能访问的需求:之前通过nginx反向代理已实现对web的代理,但后来发现还有站点为https的,所以又找了些资料,整理了一下,测试完成. 方法: Nginx代理web站点ttxsgoto.com的相关部署和配置主要如下脚本实现: #!/bin/bash path_soft=$(pwd) function base(){ yum -y install  make gcc gcc-c++ autoconf } function ins

centos6.5搭建nginx反向代理Apache服务并实现动静分离

Nginx反向代理配置步骤: 一.规划网络拓扑 二.配置Apache服务器 三.配置nginx服务器 四.进行测试   一.规划网络拓扑 二.配置Apache服务器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 安装Apache服务 [[email protected] ~]# yum -y install httpd php 注:由于我们的Apache服务器要负责动态页面的处理,所以要安装PHP.   编辑A

生产环境中nginx既做web服务又做反向代理

一.写对于初入博客园的感想 众所周知,nginx是一个高性能的HTTP和反向代理服务器,在以前工作中要么实现http要么做反向代理或者负载均衡.尚未在同一台nginx或者集群上同时既实现HTTP又实现反向代理. 那么到底nginx能否既实现HTTP又实现反向代理呢? 答案是肯定的 刚好前段时间在实际项目中有一个类似的情况出现,由此与大伙分享,由于以前没有写博文的习惯,只习惯于自己记录操作实现步骤及稳定,在以前常遇见问题都是百度.谷歌,众位网友的博文帮助自己见解决了很多问题. 由此可见技术分享的重