• Docker 系列(十):docker服务发现


    Docker + Consul + registrator实现服务发现

    Consul:分布式、高可用的,服务发现和配置的工具,数据中心

    Registrator:负责收集dockerhost上,容器服务的信息,并且发送给consul

    Consul-template:根据编辑好的模板生成新的nginx配置文件,并且负责加载nginx配置文件

    实验环境:

    docker01

    192.168.1.70

    docker02

    192.168.1.60

    docker03

    192.168.1.50

    关闭防火墙和selinux,并修改主机名

    [root@localhost ~]# systemctl stop firewalld
    [root@localhost ~]# setenforce 0
    [root@localhost ~]# hostnamectl set-hostname docker01
    [root@localhost ~]# su -

    1)docker01上,启动consul服务

    [root@docker01 ~]# unzip consul_1.5.1_linux_amd64.zip
    [root@docker01 ~]# mv consul /usr/local/bin/
    [root@docker01 ~]# chmod +x /usr/local/bin/consul

    以二进制的方式部署consul,并启动,身份为leader

    [root@docker01 ~]# consul agent -server -bootstrap 
    > -ui -data-dir=/var/lib/consul-data 
    > -bind=192.168.1.70 
    > -client=0.0.0.0 
    > -node=master

    这时这个命令会占用终端,可以使用nohup命令让它保持后台运行

    [root@docker01 ~]# nohup consul  agent  -server  -bootstrap   -ui  -data-dir=/var/lib/consul-data   -bind=192.168.1.70   -client=0.0.0.0   -node=master  &
    PS:

    -bootstrap:加入这个选项时,一般都在server单节点的时候用,自选举为leader

    -ui:开启内部web界面

    -data-dir:key/volume数据存储位置

    -bind:指定开启服务的IP

    -client:指定访问的客户端

    -node:只当集群内通信使用的名称,默认是用主机名命名的

    PS:开启的端口

    8300:集群节点

    8301:集群内部的访问

    8302:跨数据中心的通信

    8500:web ui界面

    8600:使用dns协议查看节点信息的端口

    查看conusl的信息

    [root@docker01 ~]# consul info
    leader_addr = 192.168.1.70:8300 //这个对我们比较有用,其他的都是一些它的算法

    查看集群内成员的信息

    [root@docker01 ~]# consul members
    Node Address Status Type Build Protocol DC Segment
    master 192.168.1.70:8301 alive server 1.5.1 2 dc1 <all>

    2)docker02、docker03,加入consul集群

    这里我们采用容器的方式去运行consul服务

    docker02

    [root@docker02 ~]# docker load < myprogrium-consul.tar
    [root@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:latest -join 192.168.1.70 -advertise 192.168.1.60 -client 0.0.0.0 -node=node01

    docker03

    [root@docker03 ~]# docker load < myprogrium-consul.tar
    [root@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:latest -join 192.168.1.70 -advertise 192.168.1.50 -client 0.0.0.0 -node=node02

    在docker01上就能看到加入的信息

    2019/12/26 09:50:25 [INFO] serf: EventMemberJoin: node01 192.168.1.60
    2019/12/26 09:50:25 [INFO] consul: member 'node01' joined, marking health alive
    2019/12/26 09:53:06 [INFO] serf: EventMemberJoin: node02 192.168.1.50
    2019/12/26 09:53:06 [INFO] consul: member 'node02' joined, marking health alive
    [root@docker01 ~]# consul members
    Node Address Status Type Build Protocol DC Segment
    master 192.168.1.70:8301 alive server 1.5.1 2 dc1 <all>
    node01 192.168.1.60:8301 alive client 0.5.2 2 dc1 <default>
    node02 192.168.1.50:8301 alive client 0.5.2 2 dc1 <default>
     

    浏览器访问consul服务,验证集群信息

    192.168.1.70:8500

    3) 下载部署consul-template

    在docker01上导入consul-template_0.19.5_linux_amd64.zip

    [root@docker01 ~]# unzip consul-template_0.19.5_linux_amd64.zip
    [root@docker01 ~]# mv consul-template /usr/local/bin/
    [root@docker01 ~]# chmod +x /usr/local/bin/consul-template

    4)docker02、docker03上部署registrator服务

    registrator是一个能自动发现docker container提供的服务,并在后端服务注册中心注册服务或取消服务的工具,后端注册中心支持consul、etcd、skydns2、zookeeper等

    docker02

    [root@docker02 ~]# docker load < myregistrator.tar
    [root@docker02 ~]# docker run -d 
    > --name registrator 
    > -v /var/run/docker.sock:/tmp/docker.sock 
    > --restart always 
    > gliderlabs/registrator 
    > consul://192.168.1.60:8500

    运行一个nginx容器

    [root@docker02 ~]# docker run -d -P --name test nginx:latest
    b0665dcbd6c5 nginx:latest "nginx -g 'daemon of…" 10 seconds ago Up 9 seconds 0.0.0.0:32768->80/tcp
    //映射的端口为32768

    回到浏览器

    docker03

    [root@docker03 ~]# docker load < myregistrator.tar
    [root@docker02 ~]# docker run -d 
    > --name registrator 
    > -v /var/run/docker.sock:/tmp/docker.sock 
    > --restart always 
    > gliderlabs/registrator 
    > consul://192.168.1.50:8500
    

      

    5)docker01部署一个nginx服务依赖环境

    [root@docker01 ~]# yum -y install zlib-devel openssl-devel pcre-devel

    [root@docker01 ~]# useradd -M -s /sbin/nologin nginx
    [root@docker01 ~]# tar zxf nginx-1.14.0.tar.gz
    [root@docker01 ~]# cd nginx-1.14.0/
    [root@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
     
    [root@docker01 nginx-1.14.0]# make && make install
    [root@docker01 nginx-1.14.0]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
    [root@docker01 nginx-1.14.0]# nginx -t
    nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
    [root@docker01 nginx-1.14.0]# nginx

    PS:

    这里nginx作为反向代理,代理后端docker02、docker03上nignx的容器服务,所以我们先去docker02、docker03上部署一些服务,为了方便等会看到负载的效果,所以我们运行完成容器之后,做一个主界面内容的区分

    docker02:web01 web02

    docker03:web03 web04

    docker02

    [root@docker02 ~]# docker run -itd --name web01 -P nginx:latest
    [root@docker02 ~]# docker exec -it web01 /bin/bash
    root@dac0cc15f3fe:/# cd /usr/share/nginx/html/
    root@dac0cc15f3fe:/usr/share/nginx/html# echo "This web caontainer in dockek02-web01" > index.html
    root@dac0cc15f3fe:/usr/share/nginx/html# cat index.html
    This web caontainer in dockek02-web01
    [root@docker02 ~]# docker run -itd --name web02 -P nginx:latest
    [root@docker02 ~]# docker exec -it web02 /bin/bash
    root@26d622553e5e:/# cd /usr/share/nginx/html/
    root@26d622553e5e:/usr/share/nginx/html# echo "This web caontainer in dockek02-web02" > index.html
    root@26d622553e5e:/usr/share/nginx/html# cat index.html
    This web caontainer in dockek02-web02
    [root@docker02 ~]# curl 127.0.0.1:32769
    This web caontainer in dockek02-web01
    [root@docker02 ~]# curl 127.0.0.1:32770
    This web caontainer in dockek02-web02

    docker03

    [root@docker03 ~]# docker run -itd --name web03 -P nginx:latest
    [root@docker03 ~]# docker exec -it web03 /bin/bash
    root@a10f25a91edf:/# cd /usr/share/nginx/html/
    root@a10f25a91edf:/usr/share/nginx/html# echo "This web caontainer in dockek03-web03" > index.html
    root@a10f25a91edf:/usr/share/nginx/html# cat index.html
    This web caontainer in dockek03-web03
    [root@docker03 ~]# docker run -itd --name web04 -P nginx:latest
    [root@docker03 ~]# docker exec -it web04 /bin/bash
    root@6d30a445c9b8:/# cd /usr/share/nginx/html/
    root@6d30a445c9b8:/usr/share/nginx/html# echo "his web caontainer in dockek03-web04" > index.html
    root@6d30a445c9b8:/usr/share/nginx/html# cat index.html
    This web caontainer in dockek03-web04
    [root@docker03 ~]# curl 127.0.0.1:32768
    This web caontainer in dockek03-web03
    [root@docker03 ~]# curl 127.0.0.1:32769
    This web caontainer in dockek03-web04

    更改nginx的配置文件

    [root@docker01 ~]# cd /usr/local/nginx/
    [root@docker01 nginx]# mkdir consul
    [root@docker01 nginx]# cd consul/
    [root@docker01 consul]# pwd
    /usr/local/nginx/consul
    [root@docker01 consul]# vim nginx.ctmpl
    [root@docker01 consul]# cat nginx.ctmpl
    upstream httpd_backend {
    {{range service "nginx"}}
    server {{ .Address }}:{{ .Port }};
    {{ end }}
    }
     
    server {
      listen 8000;
      server_name localhost;
      location / {
      proxy_pass http://http_backend;
    }
    }
    [root@docker01 ~]# vim /usr/local/nginx/conf/nginx.conf

    在文件最后,也就是倒数第二行添加:

    include /usr/local/nginx/consul/*.conf;
    

    使nginx的主配置文件能够识别到新产生的配置文件

    [root@docker01 ~]# nginx -s reload

    使用consul-template命令,根据模板生产的配置文件,并重新加载nginx的配置文件

    [root@docker01 consul]# consul-template -consul-addr 192.168.1.70:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/sbin/nginx  -s  reload"

    这时这个命令会占用终端,可以使用nohup命令让它保持后台运行

    [root@docker01 consul]# nohup  consul-template -consul-addr 192.168.1.70:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/sbin/nginx  -s  reload"  &

    此时,应该能够看到,新生产的vhost.conf配置文件已经生效,访问本机的8000端口可以得到不同容器提供的服务

    [root@docker01 ~]# cd /usr/local/nginx/consul/
    [root@docker01 consul]# ls
    nginx.ctmpl vhost.conf
    [root@docker01 consul]# cat vhost.conf
    upstream httpd_backend {
      server 192.168.1.60:32768;
      server 192.168.1.60:32769;
      server 192.168.1.60:32770;
      server 192.168.1.50:32768;
      server 192.168.1.50:32769;
    }
    server {
      listen 8000;
      server_name localhost;
      location / {
      proxy_pass http://httpd_backend;
      }
    }
    [root@docker01 consul]# curl localhost:8000
    This web caontainer in dockek02-web01
    [root@docker01 consul]# curl localhost:8000
    This web caontainer in dockek02-web02
    [root@docker01 consul]# curl localhost:8000
    This web caontainer in dockek03-web03
    [root@docker01 consul]# curl localhost:8000
    This web caontainer in dockek03-web04

    当然,这时不管是添加新的nginx的web容器,或是删除,生产的配置文件都会时时更新,这是我们在运行consul-template这条命令最后添加:/usr/local/sbin/nginx -s reload它的作用 

    删除之前的test容器,查看vhost文件

    [root@docker02 ~]# docker rm -f test
    [root@docker01 consul]# cat vhost.conf
    upstream httpd_backend {
      server 192.168.1.60:32769;
      server 192.168.1.60:32770;
      server 192.168.1.50:32768;
      server 192.168.1.50:32769;
    }

    在运行一个web05,查看vhost文件的变化

    [root@docker02 ~]# docker run -itd --name web05 -P nginx:latest
    upstream httpd_backend {
        server 192.168.1.60:32769;
        server 192.168.1.60:32770;
        server 192.168.1.60:32771;
        server 192.168.1.50:32768;
        server 192.168.1.50:32769;
    }

    1、docker01主机上以二进制包的方式部署consul服务并后台运行,其身份为leader

    2、docker02、docker03以容器的方式运行consul服务,并加入到docker01的consul群集中

    3、在主机docker02、docker03上后台运行registrator容器,使其自动发现docker容器提供的服务,并发送给consul

    4、在docker01上部署Nginx,提供反向代理服务,docker02、docker03主机上基于Nginx镜像,各运行两个web容器,提供不同的网页文件,以便测试效果

    5、在docker01上安装consul-template命令,将收集到的信息(registrator收集到容器的信息)写入template模板中,并且最终写入Nginx的配置文件中

    6、至此,实现客户端通过访问Nginx反向代理服务器(docker01),获得docker02、docker03服务器上运行的Nginx容器提供的网页文件

    Consul:分布式、高可用的,服务发现和配置的工具,数据中心

    Registrator:负责收集dockerhost上,容器服务的信息,并且发送给consul

    registrator是一个能自动发现docker container提供的服务,并在后端服务注册中心注册服务或取消服务的工具,后端注册中心支持consul、etcd、skydns2、zookeeper等

    Consul-template:根据编辑好的模板生成新的nginx配置文件,并且负责加载nginx配置文件

    转载:https://blog.csdn.net/weixin_45636702/article/details/104052683

  • 相关阅读:
    UnityVS(Visual Studio Tools For Unity)的安装与使用
    Balsamiq Mockups注册码
    python基础之os.system函数
    jenkins配置记录(1)--添加用户权限
    chromedriver与chrome各版本及下载地址
    高阶面试官应掌握哪些面试技巧
    [面试技巧]16个经典面试问题回答思路
    自动代码质量分析(GitLab+JenKins+SonarQube)
    Git提交代码自动触发JenKins构建项目
    Allure 安装及使用
  • 原文地址:https://www.cnblogs.com/-wenli/p/13750675.html
Copyright © 2020-2023  润新知