Docker Consul容器服务更新与发现

什么是Consul

Consul是HashiCorp公司推出的开源软件,使用GO语言编写,提供了分布式系统的服务注册和发现、配置等功能,这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格。Consul不仅具有服务治理的功能,而且使用分布式一致协议RAFT算法实现,有多数据中心的高可用方案,并且很容易和Spring Cloud等微服务框架集成,使用起来非常的简单,具有简单、易用、可插排等特点。使用简而言之,Consul提供了一种完整的服务网格解决方案 。

Consul具有以下的特点和功能

服务发现:Consul的客户端可以向Consul注册服务,例如api服务或者mysql服务,其他客户端可以使用Consul来发现服务的提供者。Consul支持使用DNS或HTTP来注册和发现服务。
运行时健康检查:Consul客户端可以提供任意数量的运行状况检查机制,这些检查机制可以是给定服务(“是Web服务器返回200 OK”)或本地节点(“内存利用率低于90%”)相关联。这些信息可以用来监控群集的运行状况,服务发现组件可以使用这些监控信息来路由流量,可以使流量远离不健康的服务。
KV存储:应用程序可以将Consul的键/值存储用于任何需求,包括动态配置,功能标记,协调,领导者选举等。它采用HTTP API使其易于使用。
安全服务通信:Consul可以为服务生成和分发TLS证书,以建立相互的TLS连接。
多数据中心:Consul支持多个数据中心。这意味着Consul的用户不必担心构建额外的抽象层以扩展到多个区域。

Consul原理

每个提供服务的节点都运行了Consul的代理,运行代理不需要服务发现和获取配置的KV键值对,代理只负责监控检查。代理节点可以和一个或者多个Consul server通讯。 Consul服务器是存储和复制数据的地方。服务器本身选出了领导者。虽然Consul可以在一台服务器上运行,但建议使用35,以避免导致数据丢失的故障情况。建议为每个数据中心使用一组Consul服务器。
如果你的组件需要发现服务,可以查询任何Consul Server或任何Consul客户端,Consul客户端会自动将查询转发给Consul Server。
需要发现其他服务或节点的基础架构组件可以查询任何Consul服务器或任何Consul代理。代理会自动将查询转发给服务器。每个数据中心都运行Consul服务器集群。发生跨数据中心服务发现或配置请求时,本地Consul服务器会将请求转发到远程数据中心并返回结果。

术语

Agent agent是一直运行在Consul集群中每个成员上的守护进程。通过运行 consul agent 来启动。agent可以运行在client或者server模式。指定节点作为client或者server是非常简单的,除非有其他agent实例。所有的agent都能运行DNS或者HTTP接口,并负责运行时检查和保持服务同步。
Client 一个Client是一个转发所有RPC到server的代理。这个client是相对无状态的。client唯一执行的后台活动是加入LAN gossip池。这有一个最低的资源开销并且仅消耗少量的网络带宽。
Server 一个server是一个有一组扩展功能的代理,这些功能包括参与Raft选举,维护集群状态,响应RPC查询,与其他数据中心交互WAN gossip和转发查询给leader或者远程数据中心。
DataCenter 虽然数据中心的定义是显而易见的,但是有一些细微的细节必须考虑。例如,在EC2中,多个可用区域被认为组成一个数据中心?我们定义数据中心为一个私有的,低延迟和高带宽的一个网络环境。这不包括访问公共网络,但是对于我们而言,同一个EC2中的多个可用区域可以被认为是一个数据中心的一部分。
Consensus 在我们的文档中,我们使用Consensus来表明就leader选举和事务的顺序达成一致。由于这些事务都被应用到有限状态机上,Consensus暗示复制状态机的一致性。
Gossip Consul建立在Serf的基础之上,它提供了一个用于多播目的的完整的gossip协议。Serf提供成员关系,故障检测和事件广播。更多的信息在gossip文档中描述。这足以知道gossip使用基于UDP的随机的点到点通信。
LAN Gossip 它包含所有位于同一个局域网或者数据中心的所有节点。
WAN Gossip 它只包含Server。这些server主要分布在不同的数据中心并且通常通过因特网或者广域网通信。
RPC 远程过程调用。这是一个允许client请求server的请求/响应机制。

Docker Consul容器服务更新与发现_第1张图片
让我们分解这张图并描述每个部分。首先,我们能看到有两个数据中心,标记为“1”和“2”。Consul对多数据中心有一流的支持并且希望这是一个常见的情况。

在每个数据中心,client和server是混合的。一般建议有3-5台server。这是基于有故障情况下的可用性和性能之间的权衡结果,因为越多的机器加入达成共识越慢。然而,并不限制client的数量,它们可以很容易的扩展到数千或者数万台。
同一个数据中心的所有节点都必须加入gossip协议。这意味着gossip协议包含一个给定数据中心的所有节点。这服务于几个目的:第一,不需要在client上配置server地址。发现都是自动完成的。第二,检测节点故障的工作不是放在server上,而是分布式的。这是的故障检测相比心跳机制有更高的可扩展性。第三:它用来作为一个消息层来通知事件,比如leader选举发生时。
每个数据中心的server都是Raft节点集合的一部分。这意味着它们一起工作并选出一个leader,一个有额外工作的server。leader负责处理所有的查询和事务。作为一致性协议的一部分,事务也必须被复制到所有其他的节点。因为这一要求,当一个非leader得server收到一个RPC请求时,它将请求转发给集群leader。
server节点也作为WAN gossip Pool的一部分。这个Pool不同于LAN Pool,因为它是为了优化互联网更高的延迟,并且它只包含其他Consul server节点。这个Pool的目的是为了允许数据中心能够以low-touch的方式发现彼此。这使得一个新的数据中心可以很容易的加入现存的WAN gossip。因为server都运行在这个pool中,它也支持跨数据中心请求。当一个server收到来自另一个数据中心的请求时,它随即转发给正确数据中想一个server。该server再转发给本地leader。
这使得数据中心之间只有一个很低的耦合,但是由于故障检测,连接缓存和复用,跨数据中心的请求都是相对快速和可靠的。

容器服务更新与发现拓扑图
Docker Consul容器服务更新与发现_第2张图片

使用docker-compose搭建consul集群环境

Docker Compose介绍

Docker Compose的前身是Fig,它是一个定义及运行多个Docker容器的工具
使用Docker Compose不再需要使用Shell脚本来启动容器
Docker Compose非常适合组合使用多个容器进行开发的场景

Consul介绍

Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置

Consul的特性
支持健康检查,允许存储键值对(不需要进行数据类型转化,可以直接使用)存储对象是以hash形式进行存储
基于Golong语言,可移植性强

支持ACL访问控制
与Docker等轻量级容器可无缝配合

案例环境部署
基于docker环境之上
在这里插入图片描述
案例需求

 实现单机网络下容器与容器之间互通
 使用Docker Compose 创建容器
 搭建Consul 服务实现自动发现个更新

Docker Compose容器编排

Docker Compose环境安装

[root@localhost~]# curl-L
https://github.com/docker/compose/releases/download/1.21.1
/docker-compose- uname -s'-'uname -m`-o
/usr/local/bin/docker-compose
[root@localhost~]# chmod +x /usr/local/bin/docker-compose
[root@localhost ~j# docker-compose -v
Docker Compose文件结构
[root@localhost compose_Inmp]# vim docker-compose.yml  yml全称(yaml)
YAML是一种标记语言很直观的数据序列化格式

文件格式及编写注意事项

不支持制表符tab键缩进,需要使用空格缩进
通常开头缩进2个空格
字符后缩进1个空格,如冒号(语法参数)、逗号、横杆    附加:nginx:1.15.4(版本号)就不需要加空格
#号注释
如果包含特殊字符用单引号引起来
布尔值必须用引号括起来  布尔值(True 真或“假” False 

Docker Compose配置常用字段
Docker Consul容器服务更新与发现_第3张图片
附加:

deploy也能在k8s中使用
restart:no,:无论什么形式容器宕机,不进行重启  
restart:always,:无论什么形式容器宕机,就进行重启
no-failure:当容器异常退出时,就进行重启
unless-stoped:不进行重启

Docker Compose常用命令
Docker Consul容器服务更新与发现_第4张图片
Compose命令说明

基本的使用格式

docker-compose [options] [COMMAND] [ARGS...]

docker-compose选项

--verbose 输出更多调试信息
--version打印版本并退出
-f,--file FILE使用特定的compose模板文件,默认为docker-compose.yml
-p,--project-name NAME指定项目名称,默认使用目录名称

案例部署
建立在docker-ce环境之下

环境优化 server1和server2安装docker(现server1上演示)

关闭防火墙,核心防护
[root@server1 ~]# iptables -F
[root@server1 ~]# setenforce 0

关闭虚拟内存的交换功能
[root@server1 ~]# swapoff -a 

为了保证实验没有外在干扰,情况所有镜像和容器

[root@server1 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@server1 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

[root@server2 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@server2 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

server1上安装Compose

[root@server1 ~]# cd /usr/local/bin/   将文件放在该系统,系统可以直接识别
[root@server1 bin]# ls
docker-compose
[root@server1 bin]# chmod +x docker-compose   //赋予执行权限
[root@server1 bin]# cd
[root@server1 ~]#

新建目录,进入目录并创建子目录

[root@server1 ~]# mkdir compose_nginx
[root@server1 ~]# cd compose_nginx/
[root@server1 compose_nginx]# mkdir nginx
[root@server1 compose_nginx]# cd nginx/

[root@server1 nginx]# vim Dockerfile
FROM centos:7
MAINTAINER xuwenyu
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.2.tar.gz /usr/local/src
WORKDIR /usr/local/src/nginx-1.12.2
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
EXPOSE 80
EXPOSE 443
RUN echo "daemon off;" >>  /usr/local/nginx/conf/nginx.conf
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]

上传nignx12.2.2的安装包

root@server1 nginx]# vim run.sh  //创建脚本

#!/bin/bash
/usr/local/nginx/sbin/nginx

[root@server1 nginx]# ls
Dockerfile  nginx-1.12.2.tar.gz  run.sh

[root@server1 nginx]# cd ..
[root@server1 compose_nginx]# ls
nginx
[root@server1 compose_nginx]# vim docker-compose.yaml

version: '3'
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
     - 1216:80
     - 1218:443
    networks:
     - abc
    volumes:
     - ./wwwroot:/usr/local/nginx/html
networks:
  abc:

[root@server1 compose_nginx]# ls
docker-compose.yaml  nginx

[root@server1 compose_nginx]# cd
[root@server1 ~]# docker-compose -f /root/compose_nginx/docker-compose.yaml up -d

生成过程最后一步:Creating compose_nginx_nginx_1 ... done

[root@server1 ~]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED              SIZE
compose_nginx_nginx   latest              6b70f0a4bce7        About a minute ago   384MB
centos                7                   8652b9f0cb4c        2 weeks ago          204MB

[root@server1 ~]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                                         NAMES
da922c533de2        compose_nginx_nginx   "/run.sh"           2 minutes ago       Up About a minute   0.0.0.0:1216->80/tcp, 0.0.0.0:1218->443/tcp   compose_nginx_nginx_1

[root@server1 ~]# cd /root/compose_nginx/
[root@server1 compose_nginx]# ls
docker-compose.yaml  nginx  wwwroot   wwwroot:存放nginx首页

[root@server1 compose_nginx]# cd wwwroot/
[root@server1 wwwroot]# vim index.html
<h1>xuwenyu wt</h1>

[root@server1 wwwroot]# ifconfig   //发现有新的IP地址生成
br-08d619e8a425: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
        
是重新创造的命名空间    来源于该文件docker-compose.yaml

[root@server1 ~]# docker exec -it da922c533de2 /bin/bash
[root@nginx nginx-1.12.2]# yum install net-tools -y

[root@nginx nginx-1.12.2]# ifconfig   //发现此时容器的id为18网段(原因:networks给其重新划分了(定义了)子网段)
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.2  netmask 255.255.0.0  broadcast 172.18.255.255

查看文件结构
[root@server1 ~]# cd compose_nginx/

[root@server1compose_nginx]# yum install tree -y

[root@server1 compose_nginx]# tree ./
./
├── docker-compose.yaml
├── nginx
   ├── Dockerfile
   ├── nginx-1.12.2.tar.gz
   └── run.sh
└── wwwroot
    └── index.html

实验效果图
Docker Consul容器服务更新与发现_第5张图片
在server1上安装consul

[root@server1 ~]# mkdir consul
[root@server1 ~]# cd consul/
[root@server1 consul]# ls   //在该目录下上传文件,查看上传文件
consul_0.9.2_linux_amd64.zip
[root@server1 consul]# unzip consul_0.9.2_linux_amd64.zip 
[root@server1 consul]# mv consul /usr/local/bin/  将consul移动到/usr/local/bin
[root@server1 consul]# consul agent \  #使用代理功能
 -server \
 -bootstrap \                      #参与选举为领袖
 -ui \
 -data-dir=/var/lib/consul-data \    #数据文件存放位置
 -bind=20.0.0.11 \                      #监听地址
 -client=0.0.0.0 \                   #所有网段
 -node=consul-server01 &> /var/log/consul.log &
[1] 51608
[root@server1 consul]# jobs   #查看后台运行情况
[1]+  运行中               consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=20.0.0.11 -client=0.0.0.0 -node=consul-server01 &>/var/log/consul.log &
[root@server1 consul]# consul members   #查看集群信息
Node             Address         Status  Type    Build  Protocol  DC
consul-server01  20.0.0.11:8301  alive(活跃状态)   server  0.9.2  2         dc1

[root@server1 consul]# curl 127.0.0.1:8500/v1/status/peers
["20.0.0.11:8300"][root@server1 consul]# curl 127.0.0.1:8500/v1/catalog/nodes
[{"ID":"4804b8a5-173a-1501-e53f-8f53eb9318f8","Node":"consul-server01","Address":"20.0.0.11","Datacenter":"dc1","TaggedAddresses":{"lan":"20.0.0.11","wan":"20.0.0.11"},"Meta":{},"CreateIndex":5,"ModifyIndex":6}][root@server1 consul]#

容器服务自动加入nginx群集(开启另一台主机),安装gliderlabs/registrator

[root@server2 ~]# hostnamectl set-hostname node
[root@server2 ~]# bash
[root@node ~]# systemctl status docker
 docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since  2020-12-01 15:07:31 CST; 2h 15min ago

[root@node ~]# docker run -d \
> --name=registrator \          #容器名称
> --net=host \                  #指定网络
> -v /var/run/docker.sock:/tmp/docker.sock \  #挂载
> --restart=always \
> gliderlabs/registrator:latest \   #镜像名称
> -ip=20.0.0.12 \
> consul://20.0.0.11:8500
Unable to find image 'gliderlabs/registrator:latest' locally
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
23001fa271c31c130d22aa4a3473eda6521da5448e2c8a8eb0e04a37d5fb8bee

 查看容器
[root@node ~]# docker ps -a
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS               NAMES
23001fa271c3        gliderlabs/registrator:latest   "/bin/registrator -i…"   25 seconds ago      Up 24 seconds                           registrator

网页登录http://20.0.0.10:8500,查看节点服务状态
Docker Consul容器服务更新与发现_第6张图片
测试服务发现功能是否正常,在node上安装两个httpd及nginx容器

[root@node ~]# docker run -itd -p:83:80 --name test-01 -h test01 nginx  
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
852e50cd189d: Pull complete 
571d7e852307: Pull complete 
addb10abd9cb: Pull complete 
d20aa7ccdb77: Pull complete 
8b03f1e11359: Pull complete 
Digest: sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3
Status: Downloaded newer image for nginx:latest
84d4a1df57a2c3d5ff6db2d10ee6d9741713c5eb73d9c794caccf8247a9faf63

[root@node ~]# docker run -itd -p:84:80 --name test-02 -h test02 nginx
66db6c77338e7af77f60941c4c5ed3ef3e524871b70dd4fe99dd290a8425339f

[root@node ~]# docker ps -a
CONTAINER ID        IMAGE                           COMMAND                  CREATED              STATUS              PORTS                NAMES
66db6c77338e        nginx                           "/docker-entrypoint.…"   41 seconds ago       Up 40 seconds       0.0.0.0:84->80/tcp   test-02
84d4a1df57a2        nginx                           "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:83->80/tcp   test-01
23001fa271c3        gliderlabs/registrator:latest   "/bin/registrator -i…"   5 minutes ago        Up 4 minutes                             registrator

Docker Consul容器服务更新与发现_第7张图片

[root@node ~]# docker run -itd -p:88:80 --name test-03 -h test03 httpd
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
852e50cd189d: Already exists 
67d51c33d390: Pull complete 
b0ad2a3b9567: Pull complete 
136f1f71f30c: Pull complete 
01f8ace29294: Pull complete 
Digest: sha256:fddc534b7f6bb6197855be559244adb11907d569aae1283db8e6ce8bb8f6f456
Status: Downloaded newer image for httpd:latest
bcb53ce07c19fe86bd43ebac2950301979c92585d2952ce5d0fa3a17b5a61ac0
[root@node ~]# docker ps -a
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                NAMES
bcb53ce07c19        httpd                           "httpd-foreground"       15 seconds ago      Up 15 seconds       0.0.0.0:88->80/tcp   test-03
66db6c77338e        nginx                           "/docker-entrypoint.…"   55 minutes ago      Up 55 minutes       0.0.0.0:84->80/tcp   test-02
84d4a1df57a2        nginx                           "/docker-entrypoint.…"   55 minutes ago      Up 55 minutes       0.0.0.0:83->80/tcp   test-01
23001fa271c3        gliderlabs/registrator:latest   "/bin/registrator -i…"   59 minutes ago      Up 59 minutes                            registrator

Docker Consul容器服务更新与发现_第8张图片

[root@node ~]# docker run -itd -p:89:80 --name test-04 -h test04 httpd
39aec99fa39af9214a30e164c01eadfe782bd8ee90105160dc41bf81a52785e2

Docker Consul容器服务更新与发现_第9张图片
Docker Consul容器服务更新与发现_第10张图片
删除容器进行查看

[root@node ~]# docker stop bcb53ce07c19
bcb53ce07c19
[root@node ~]# docker rm bcb53ce07c19
bcb53ce07c19

Docker Consul容器服务更新与发现_第11张图片
在consul服务器上查看服务

[root@server1 consul]#  curl 127.0.0.1:8500/v1/catalog/services
{"consul":[],"httpd":[],"nginx":[]}[root@server1 consul]#
 
[root@node ~]# docker stop 39aec99fa39a
39aec99fa39a
[root@node ~]# docker rm 39aec99fa39a
39aec99fa39a

[root@server1 consul]#  curl 127.0.0.1:8500/v1/catalog/services
{"consul":[],"nginx":[]}[root@server1 consul]#

安装consul-template
Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行shell命令执行更新操作,重新加载Nginx。Consul-Template可以查询Consul中的服务目录、Key、Key-values等。这种强大的抽象功能和查询语言模板可以使Consul-Template特别适合动态的创建配置文件。
例如:创建Apache/Nginx Proxy Balancers、Haproxy Backends

在server1上安装consul-template

准备template nginx模板文件
//在consul上操作
[root@server1 ~]# cd consul/
[root@server1 consul]# ls
consul_0.9.2_linux_amd64.zip
[root@server1 consul]# vim nginx.ctmpl
upstream http_backend {
  {{range service "nginx"}}
   server {{.Address}}:{{.Port}};
   {{end}}
}
server {
  listen 83;
  server_name localhost 20.0.0.11;
  access_log /var/log/nginx/wang-access.log;
  index index.html 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;
   }
}
编译安装nginx
[root@server1 consul]# yum install gcc gcc-c++ pcre-devel zlib-devel -y
上传nignx安装包至当前目录下
[root@server1 consul]# ll
总用量 10960
-rw-r--r--. 1 root root 10233177 11 30 14:11 consul_0.9.2_linux_amd64.zip
-rw-r--r--. 1 root root   980831 12  1 08:56 nginx-1.12.0.tar.gz
-rw-r--r--. 1 root root      477 12  1 19:07 nginx.ctmpl

[root@server1 consul]# tar zxvf nginx-1.12.0.tar.gz -C /opt/
[root@server1 consul]# cd /opt/
[root@server1 opt]# ls
containerd  nginx-1.12.0  rh
[root@server1 opt]# cd nginx-1.12.0/
[root@server1 nginx-1.12.0]# ./configure --prefix=/usr/local/nginx
[root@server1 nginx-1.12.0]# make && make install
[root@server1 nginx-1.12.0]# cd /usr/local/
[root@server1 local]# ls
bin  etc  games  include  lib  lib64  libexec  nginx  sbin  share  src
[root@server1 local]# cd nginx/
[root@server1 nginx]# ls
conf  html  logs  sbin
[root@server1 nginx]# cd conf/
[root@server1 conf]# ls
fastcgi.conf          fastcgi_params.default  mime.types          nginx.conf.default   uwsgi_params
fastcgi.conf.default  koi-utf                 mime.types.default  scgi_params          uwsgi_params.default
fastcgi_params        koi-win                 nginx.conf          scgi_params.default  win-utf
[root@server1 conf]# vim nginx.conf
18     include       mime.types;
19     include       vhost/*.conf;
[root@server1 conf]# ls /root/consul/
consul_0.9.2_linux_amd64.zip  nginx-1.12.0.tar.gz  nginx.ctmpl
[root@server1 conf]# pwd
/usr/local/nginx/conf
[root@server1 conf]# mkdir vhost
[root@server1 conf]# ls vhost/
[root@server1 conf]# mkdir /var/log/nginx
[root@server1 conf]# netstat -anpt | grep nginx
[root@server1 conf]# /usr/local/nginx/sbin/nginx 
[root@server1 conf]# netstat -anpt | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      55534/nginx: master

下载consul_0.9.2_linux_amd64.zip文件
[root@server1 conf]# cd 
[root@server1 ~]# rz -E
rz waiting to receive.
[root@server1 ~]# ll
-rw-r--r--. 1 root root  2694811 11 30 14:11 consul-template_0.19.3_linux_amd64.zip
[root@server1 ~]# unzip consul-template_0.19.3_linux_amd64.zip 
-rwxr-xr-x. 1 root root  7466016 9  12 2017 consul-template
[root@server1 ~]# mv consul-template /usr/local/bin/

[root@server1 ~]# consul-template -consul-addr 20.0.0.11:8500 -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/wang.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info  //进入监控模式
2020/12/01 11:41:08.606341 [INFO] consul-template v0.19.3 (ebf2d3d)
2020/12/01 11:41:08.606355 [INFO] (runner) creating new runner (dry: false, once: false)
2020/12/01 11:41:08.606718 [INFO] (runner) creating watcher
2020/12/01 11:41:08.607918 [INFO] (runner) starting
2020/12/01 11:41:08.607972 [INFO] (runner) initiating run
2020/12/01 11:41:08.612665 [INFO] (runner) initiating run

再开同一个终端查看

[root@server1 ~]# cd /usr/local/nginx/conf/
[root@server1 conf]# ls
fastcgi.conf          fastcgi_params.default  mime.types          nginx.conf.default   uwsgi_params          win-utf
fastcgi.conf.default  koi-utf                 mime.types.default  scgi_params          uwsgi_params.default
fastcgi_params        koi-win                 nginx.conf          scgi_params.default  vhost
[root@server1 conf]# cd vhost/
[root@server1 vhost]# ls
wang.conf
[root@server1 vhost]# vim wang.conf 
[root@server1 vhost]# netstat -anpt | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      55534/nginx: master 
tcp        0      0 0.0.0.0:83              0.0.0.0:*               LISTEN      55534/nginx: master 

效果图
Docker Consul容器服务更新与发现_第12张图片
如何判断nginx页面是反向代理还是web中node节点的nginx页面(查看日志)
节点上查看

[root@node ~]# docker ps -a
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                NAMES
66db6c77338e        nginx                           "/docker-entrypoint.…"   2 hours ago         Up 2 hours          0.0.0.0:84->80/tcp   test-02
84d4a1df57a2        nginx                           "/docker-entrypoint.…"   2 hours ago         Up 2 hours          0.0.0.0:83->80/tcp   test-01
23001fa271c3        gliderlabs/registrator:latest   "/bin/registrator -i…"   2 hours ago         Up 2 hours                               registrator

[root@node ~]# docker logs -f test-01
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
20.0.0.11 - - [01/Dec/2020:11:46:47 +0000] "GET / HTTP/1.0" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.47" "20.0.0.1"
^C
[root@node ~]# docker logs -f test-02
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2020/12/01 11:46:47 [error] 28#28: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 20.0.0.11, server: localhost, request: "GET /favicon.ico HTTP/1.0", host: "20.0.0.11", referrer: "http://20.0.0.11:83/"
20.0.0.11 - - [01/Dec/2020:11:46:47 +0000] "GET /favicon.ico HTTP/1.0" 404 555 "http://20.0.0.11:83/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.47" "20.0.0.1"
20.0.0.11 - - [01/Dec/2020:11:50:44 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.47" "20.0.0.1"
20.0.0.11 - - [01/Dec/2020:11:50:53 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.47" "20.0.0.1"

此时说明是访问后面的容器

增加一个nginx容器节点

增加一个nginx容器节点,测试服务发现及配置更新功能
//在registrator服务端注册
docker run -itd -p:85:80 --name test-05 -h test05 nginx
2bc86b9eca99891022950068fd11490672576b3ce403eb8ef9e64f520bf7cd7c
[root@node ~]#  docker ps -a
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                NAMES
2bc86b9eca99        nginx                           "/docker-entrypoint.…"   11 seconds ago      Up 11 seconds       0.0.0.0:85->80/tcp   test-05
66db6c77338e        nginx                           "/docker-entrypoint.…"   2 hours ago         Up 2 hours          0.0.0.0:84->80/tcp   test-02
84d4a1df57a2        nginx                           "/docker-entrypoint.…"   2 hours ago         Up 2 hours          0.0.0.0:83->80/tcp   test-01
23001fa271c3        gliderlabs/registrator:latest   "/bin/registrator -i…"   2 hours ago         Up 2 hours                               registrator

发现监控出现以下变化

在这里插入图片描述

[root@server1 vhost]# vim wang.conf   发现自动生成了以下命令
upstream http_backend {
   server 20.0.0.12:83;
   server 20.0.0.12:84;
   server 20.0.0.12:85;
查看test-05日志发现,刷新网络,日志更新说明一旦添加镜像就能实现调度

Docker Consul容器服务更新与发现_第13张图片
Docker Consul容器服务更新与发现_第14张图片
删除(test01)容器进行查看

[root@node ~]# docker ps -a
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                NAMES
2bc86b9eca99        nginx                           "/docker-entrypoint.…"   8 minutes ago       Up 8 minutes        0.0.0.0:85->80/tcp   test-05
66db6c77338e        nginx                           "/docker-entrypoint.…"   3 hours ago         Up 3 hours          0.0.0.0:84->80/tcp   test-02
84d4a1df57a2        nginx                           "/docker-entrypoint.…"   3 hours ago         Up 3 hours          0.0.0.0:83->80/tcp   test-01
23001fa271c3        gliderlabs/registrator:latest   "/bin/registrator -i…"   3 hours ago         Up 3 hours                               registrator
[root@node ~]# docker stop 84d4a1df57a2
84d4a1df57a2
[root@node ~]# docker rm 84d4a1df57a2
84d4a1df57a2
[root@node ~]# docker ps -a
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                NAMES
2bc86b9eca99        nginx                           "/docker-entrypoint.…"   10 minutes ago      Up 10 minutes       0.0.0.0:85->80/tcp   test-05
66db6c77338e        nginx                           "/docker-entrypoint.…"   3 hours ago         Up 3 hours          0.0.0.0:84->80/tcp   test-02
23001fa271c3        gliderlabs/registrator:latest   "/bin/registrator -i…"   3 hours ago         Up 3 hours                               registrator

此时监控发生变化截图所示
在这里插入图片描述
查看目录发现自动删除一段节点

pstream http_backend {
   server 20.0.0.12:84;
   server 20.0.0.12:85;

consul 多节点

[root@server1 vhost]# cd /usr/local/bin/
[root@server1 bin]# ls
consul  consul-template  docker-compose
[root@server1 bin]# scp consul root@20.0.0.13:/usr/local/bin
The authenticity of host '20.0.0.13 (20.0.0.13)' can't be established.
ECDSA key fingerprint is SHA256:hEV9VE2F5nsCmCKJ+ff91Aa+kau+PsBmzRCpEKlBGXA.
ECDSA key fingerprint is MD5:73:20:4f:90:c5:75:fa:cd:ad:d5:e7:21:70:1b:18:47.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '20.0.0.13' (ECDSA) to the list of known hosts.
root@20.0.0.13's password:   输入主机密码

上传consul压缩包到server3上

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

//添加一台已有docker环境的服务器20.0.0.13/24加入已有的群集中
 consul agent \
 -server \
 -bootstrap \
 -ui \
 -data-dir=/var/lib/consul-data \
 -bind=20.0.0.13 \
 -client=0.0.0.0 \
 -node=consul-server02 \
 -enable-script-checks=true \
 -datacenter=dc1 \
 -join 20.0.0.11 &> /var/log/consul.log &

-enable-script-checks=true:设置检查服务为可用
-datacenter:数据中心名称
-join:加入到已有的集群中

Docker Consul容器服务更新与发现_第15张图片

你可能感兴趣的:(docker,docker-compose,cons,consul)