作者:Carrie
出处:https://home.cnblogs.com/u/hanjiali
版权:本文版权归作者和博客园共有
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任

  docker最核心的是容器,容器中有相应的业务环境,容器中跑的业务,那么怎么实现容器的创建和删除,业务还能够不收影响的提供服务

如果创建新的容器,怎么样快速发现业务并且提供服务?

这里就讲一下服务注册

 

什么是服务注册中心?
       服务注册中心本质上是为了了解解耦服务提供者和服务消费者,对于任何一个微服务,原则上都存在多个支持者,所以为了支持弹性伸缩的特性,微服务的提供数量和分布往往是不同变换的,所以需要引用额外的组件来管理微服务提供者的注册和发现。而这个组件就是服务注册中心。

 

服务注册中心的软件

  •  Zookeeper

  主要的应用在大数据领域,是一种分布式,开放源码的分布式应用程序协调服务,是Hadoop和Hbase的重要组件,他是一个分布式应用提供的一致性的服务软件。

  •  Eureka

  是基于REST服务,主要是AWS云服务为支持,提供服务发现并实现负载均衡和故障转移

  •  Etcd

        是基于一个分布式键值对存储系统,用于可靠,快速的保存关键的数据,并提供访问,通过分布式锁,leader选举和写屏障

  •  Consul

  是HashiCorp公司推出的开源工具,用来实现分布式系统的服务发现和配置,安装包是一个可执行的文件,方面部署

Consul 主要功能

  • 1, 服务发现

    通过DNS和HTTP接口使得消费者发现服务,应用程序可以轻松找到所依赖的服务

  • 2, 健康检查

    防止将请求转发到不健康的主机上

  • 3, 键值存储

    可以使用分层键/值进行存储

Consul agent 是Consul的核心组件,分为客户端和服务端两种模式

  1.  默认以客户端模式运行,提供服务注册,健康检查,转发查询等
  2. server模式去启动时使用-server的选项指定,用于维护Consul集群状态,Raft协议进行选举。
  3. Agent 必须在每个Consul节点运行,所以运行的Consul agent节点构成Consul集群。
  4. 建议Consul集群至少有3或者5个节点运行Consul agent server模式,client节点不限
  5. 通过join和rejoin选项加入集群,一旦加入,集群信息总使用gossip算法同步到整个集群节点

 

自动发现自动注册的方案

  1. Docker+Etcd+Confd+Nginx
  2. Docker+Consul+Nginx

 

 

注册器(registrator):根据服务运行状态,注册/注销服务。主要要解决的问题是,何时发起注册/注销动作。

注册表(registry):存储服务信息。常见的解决方案有zookeeper、etcd、cousul等。

发现机制(discovery):从注册表读取服务信息,给用户封装访问接口。

项目部署(Docker+Consul+Nginx)

        使用Docker 将Consul,Consul Template,Registrator 和nginx结合成一个可拓展的服务架构,此架构可以添加和移除服务,具体部署如下

                             

  •   当容器启动后registrator就会进行注册
  •        registrator会将注册信息传送给consul agent client
  •   consul agent client将文件直接传送给leader
  •   leader会将新的信息更新到consul template上
  •   consul template会将数据写入到nginx.conf中
  •   nginx会根据nginx.xonf文件给web提供数据

 

 

 

服务搭建

 

服务器

IP地址

软件

操作系统

Consul

192.168.2.224

Nginx consul conul-temliate

Centos7

Docker01

192.168.2.222

Docker-ce registrator

Centos7

Docker02

192.168.2.223

Docker-ce registrator

Centos7

1.部署consul

 

 

  • 解压consul包
  • [root@consul ~]# unzip consul_0.9.2_linux_amd64.zip
    
    Archive:  consul_0.9.2_linux_amd64.zip
    
      inflating: consul                 
    
    [root@consul ~]# mv consul /usr/bin/
    

      

  •  指定leader的consul,并且指定相应的数据参数
  • [root@consul ~]# nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.2.224 -client=0.0.0.0 -node=consul-server01 &> /var/log/consul.log &
    
    [1] 2602  
    • 命令解释
  • consul agent -server -bootstrap :本身设置成为leader,一个的话指定一下,多个就不需要了
  • nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。
  • -ui:指定开启UI界面显示
  • -data-dir=/var/lib/consul-data 数据放在的路径
  • -bind=192.168.2.224 监听的IP
  •  -client=0.0.0.0 绑定在哪个client地址
  • -node=consul-server01 节点在集群中的名字,在集群中节点是唯一的,默认是该节点的主机名 

 

  • 查看是否运行中
  • [root@consul ~]# jobs
    
    [1]+  运行中               nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.2.224 -client=0.0.0.0 -node=consul-server01 &>/var/log/consul.log &
    

      

  • 查看consul集群成员的信息(因为只部署了一个consul,所以现在只能可查看到一个)
  • [root@consul ~]# consul members
    
    Node             Address             Status  Type    Build  Protocol  DC
    
    consul-server01  192.168.2.224:8301  alive   server  0.9.2  2         dc1
    

      

  • 查看consul集群中的leader
  • [root@consul ~]# consul info |grep leader
    
           leader = true
    
           leader_addr = 192.168.2.224:8300
    

      

  • 查看consul所管理的服务
  • [root@consul ~]# consul catalog services
    
    Consul
    
    一共五个端口
    
    8300  replication leader farwarding的端口相互复制的端口
    
    8301   lan cossip的端口
    
    8302   wan gossip的端口
    
    8500    web ui界面的端口
    
    8600    使用dns协议查看节点信息的端口
    

     

  •  

     

  • 下载镜像
  • [root@docker01 docker]# docker pull gliderlabs/registrator:latest
    
    latest: Pulling from gliderlabs/registrator
    
    Image docker.io/gliderlabs/registrator:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
    
    c87f684ee1c2: Pull complete
    
    a0559c0b3676: Pull complete
    
    a28552c49839: Pull complete
    
    Digest: sha256:6e708681dd52e28f4f39d048ac75376c9a762c44b3d75b2824173f8364e52c10
    
    Status: Downloaded newer image for gliderlabs/registrator:latest
    
    docker.io/gliderlabs/registrator:latest
    
     
    

      

 

2.部署registrator容器服务

  • 运行registrator容器
  • [root@docker01 docker]# docker run -d --name=registrator --net=host -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator:latest -ip=192.168.2.222 consul://192.168.2.224:8500
    [root@docker02 docker]#  docker run -d --name=registrator --net=host -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator:latest -ip=192.168.2.223 consul://192.168.2.224:8500
  •  测试服务发现功能是正常
  • 宿主机访问http://192.168.2.224:8500/ui/#/dc1/services
  • 编写web脚本,要进行测试
  • [root@docker01 docker]# vim /web/index.jsp
    
    <%@ page language="java" contentType="text/html; charset=utf-8"
    
        pageEncoding="utf-8"%>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    
    <html>
    
    <head>
    
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    
    <title>登录</title>
    
    </head>
    
    <body>
    
            <form action="LoginServlet" method="post">
    
                    <table>
    
                            <tr>
    
                                    <td>账号</td>
    
                                    <td><input type="text" name="username"></td>
    
                            </tr>
    
                            <tr>
    
                                    <td>密码</td>
    
                                    <td><input type="password" name="password"></td>
    
                            </tr>
    
                            <tr>
    
                                    <td><input type="submit" value="登录"></td>
    
                            </tr>
    
                    </table>
    
            </form>
    
    </body>
    
  • 开启两台容器进行测试  

  • [root@docker01 docker]# docker run -itd -p:8002:8080 -v /web:/usr/local/tomcat/webapps/ROOT --name docker01-t2 -h docker01-t2 tomcat
    
    b51abc4d730170b906bc033c69bd2fa3eb44369fcabd41ea6c90eb55f116b02f
    
    [root@docker01 docker]# docker run -itd -p:8001:8080 -v /web:/usr/local/tomcat/webapps/ROOT --name docker01-t1 -h docker01-t1 tomcat
    
    7314559a133f23d5eebd08846922964ea5d9eeccd5cf3281c7bcfc5ff6061b0e
    
  • 测试成功
  • 增加两台tomcat,表示测试成功
  •  

  • 再次不同端口增加两台tomcat容器
  • [root@docker02 docker]#  docker run -itd -p:8001:8080 -v /web:/usr/local/tomcat/webapps/ROOT --name docker01-t1 -h docker01-t1 tomcat
    Unable to find image 'tomcat:latest' locally
    latest: Pulling from library/tomcat
    6c33745f49b4: Pull complete 
    c87cd3c61e27: Pull complete 
    05a3c799ec37: Pull complete 
    a61c38f966ac: Pull complete 
    396b39798a69: Pull complete 
    576b6480761a: Pull complete 
    0d66e5d46fdf: Pull complete 
    c9a19e25684c: Pull complete 
    511576b95265: Pull complete 
    7cbc3d736630: Pull complete 
    Digest: sha256:f728ca177fee0851aea29499fbb2013737231a00264f517cc3d185f6f8bf09a8
    Status: Downloaded newer image for tomcat:latest
    4f73eefca98e2e5eee55463e3a298e1d20529b08be2fb25971bcdaa657484af6
    [root@docker02 docker]# docker run -itd -p:8002:8080 -v /web:/usr/local/tomcat/webapps/ROOT --name docker01-t2 -h docker01-t2 tomcat
    ef8b5c1174cb45441a9ce68b124688c07ba228456fac8bef54a551bf2701fdac
    [root@docker02 docker]#
    
  • 进行测试
  •  

  •  

 

3. 安装consul-template

 

  •    
    [root@consul ~]# mkdir consul
    
    [root@consul ~]# cd consul
    
    [root@consul consul]# vim /root/consul/nginx.tmp
    
    [root@consul consul]# cat /root/consul/nginx.tmp
    
     
    
    uptream http_backend {
    
           {{range service "tomcat"}}        
    
           server {{ .Address }}:{{ .Port }};       
    
           {{ end }}
    
    }
    
    server {
    
           listen 8080;
    
           server_name localhost 192.168.2.224;
    
           access_log /usr/local/nginx/logs/crushlinux-access.log;
    
           index index.html index.jsp index.php;
    
           location / {
    
           proxy_set_header HOST $host;
    
           proxy_set_header X-Real-IP $remote_addr;
    
           proxy_set_header Client-IP $remote_addr;
    
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
           proxy_pass http://http_backend;
    
           }
    
    }
    

      

4.安装NGINX

  • [root@consul consul]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel openssl-devel
    
    [root@consul ~]# tar xf nginx-1.12.1.tar_\(1\).gz -C /usr/src/
    
    [root@consul nginx-1.12.1]# cd /usr/src/nginx-1.12.1/
    
    [root@consul nginx-1.12.1]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_realip_module --with-pcre --with-http_ssl_module && make -j 2 && make install
    

     

  • 修改配置文件
  • 将下列加入配置文件:
    
    [root@consul nginx-1.12.1]# vim /usr/local/nginx/conf/nginx.conf
    
    include vhost/*.conf;
    
  • 创建目录,重新启动NGINX

  • [root@consul ~]# mkdir /usr/local/nginx/conf/vhost/
    
    [root@consul ~]# /usr/local/nginx/sbin/nginx
    

 

5.测试:  

 

  • 目前目录下无东西,基于consul模板生成子文件
  • [root@consul ~]# ls /usr/local/nginx/conf/vhost/
    
    [root@consul ~]# ls consul
    
    nginx.tmp
    

 

  • 配置并启用consul-template
  • [root@consul ~]# unzip consul-template_0.19.3_linux_amd64_\(1\).zip
    
    Archive:  consul-template_0.19.3_linux_amd64_(1).zip
    
      inflating: consul-template        
    
    [root@consul ~]# ls
    
    anaconda-ks.cfg                             downloads.html
    
    CentOS-7-x86_64-DVD-1810.zip                index.html
    
    centos-7-x86_64.tar.gz                      mnt
    
    consul                                      mysql
    
    consul_0.9.2_linux_amd64.zip                nginx-1.12.1
    
    consul-template                             nginx-1.12.1.tar_(1).gz
    
    consul-template_0.19.3_linux_amd64_(1).zip  stress
    
    [root@consul ~]# mv consul-template /usr/bin/
    
    [root@consul ~]# consul-template -consul-addr 192.168.2.224:8500 -template "/root/consul/nginx.tmp:/usr/local/nginx/conf/vhost/Carrie.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info
    
  • 查看子文件,已经出现了相应内容
  • [root@consul ~]# ls /usr/local/nginx/conf/vhost/
    
    Carrie.conf
    
    [root@consul ~]# cat  /usr/local/nginx/conf/vhost/Carrie.conf
    
     
    
    uptream http_backend {
    
                   
    
           server 192.168.2.222:8001;       
    
                   
    
           server 192.168.2.222:8002;       
    
                   
    
           server 192.168.2.223:8001;       
    
                   
    
           server 192.168.2.223:8002;       
    
          
    
    }
    
    server {
    
           listen 8080;
    
           server_name localhost 192.168.2.224;
    
           access_log /usr/local/nginx/logs/crushlinux-access.log;
    
           index index.html index.jsp index.php;
    
           location / {
    
           proxy_set_header HOST $host;
    
           proxy_set_header X-Real-IP $remote_addr;
    
           proxy_set_header Client-IP $remote_addr;
    
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
           proxy_pass http://http_backend;
    
           }
    
    }
    

     

至此部署成功。

 

posted on 2020-12-20 13:44  不吃葡萄楞吐皮  阅读(461)  评论(0编辑  收藏  举报