Docker容器---docker-Consul部署

一、Docker-consul简介

1、概述

consul是google开源的一个使用go语言开发的服务管理软件。支持多数据中心、分布式高可用的、服务发现和配置共享。采用Raft算法,用来保证服务的高可用。内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。
服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行agent,他有两种运行模式server 和 client。 每个数据中心官方建议需要3或5个server节点以保证数据安全,同时保证server-leader的选举能够正确的进行。
安装consul是用于服务注册,也就是容器本身的一些信息注册到consul里面,其他程序可以通过consul获取注册的相关服务信息,这就是服务注册与发现。

2、Consul两种模式

client模式下,所有注册到当前节点的服务会被转发到server节点,本身是不持久化这些信息。
server模式下,功能和client模式相似,唯一不同的是,它会把所有的信息持久化到本地,这样遇到故障,信息是可以被保留的。
server-leader是所有server节点的老大,它和其它server节点不同的是,它需要负责同步注册的信息给其它的server节点,同时也要负责各个节点的健康监测。

二、Consul特性

1、特性

  • 支持健康检查、允许存储键值对

  • 基于Golong语言,可移植性强

  • 支持ACL访问控制

2、应用场景

Consul的应用场景包括服务发现、服务隔离、服务配置:

服务发现场景中consul作为注册中心,服务地址被注册到consul中以后,可以使用consul提供的dns、http接口查询,consul支持health check。
服务隔离场景中consul支持以服务为单位设置访问策略,能同时支持经典的平台和新兴的平台,支持tls证书分发,service-to-service加密。
服务配置场景中consul提供key-value数据存储功能,并且能将变动迅速地通知出去,借助Consul可以实现配置共享,需要读取配置的服务可以从Consul中读取到准确的配置信息。
Consul可以帮助系统管理者更清晰的了解复杂系统内部的系统架构,运维人员可以将Consul看成一种监控软件,也可以看成一种资产(资源)管理系统。

三、部署Consul集群(server端100)

1、建立Consul服务

[root@localhost ~]#cd /opt/
[root@localhost opt]#mkdir consul
[root@localhost opt]#cd /opt/consul/
[root@localhost consul]#rz -E
rz waiting to receive.
[root@localhost consul]#ls
consul_0.9.2_linux_amd64.zip
[root@localhost consul]#unzip consul_0.9.2_linux_amd64.zip 
Archive:  consul_0.9.2_linux_amd64.zip
  inflating: consul                  
[root@localhost consul]#mv  consul /usr/local/bin/

[root@localhost consul]#consul --version
Consul v0.9.2
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)

2、设置代理,在后台启动consul服务端

[root@localhost consul]#consul agent \
> -server \
> -bootstrap \
> -ui \
> -data-dir=/var/lib/consul-data \
> -bind=192.168.10.100 \
> -client=0.0.0.0 \
> -node=consul-server01 &> /var/log/consul.log &
[1] 17895
[root@localhost consul]#netstat  -natp | grep consul
tcp        0      0 192.168.10.100:8300     0.0.0.0:*               LISTEN      17895/consul        
tcp        0      0 192.168.10.100:8301     0.0.0.0:*               LISTEN      17895/consul        
tcp        0      0 192.168.10.100:8302     0.0.0.0:*               LISTEN      17895/consul        
tcp6       0      0 :::8500                 :::*                    LISTEN      17895/consul        
tcp6       0      0 :::8600                 :::*                    LISTEN      17895/consul    

3、查看集群信息

[root@localhost consul]#consul members  #查看members状态
Node             Address              Status  Type    Build  Protocol  DC
consul-server01  192.168.10.100:8301  alive   server  0.9.2  2         dc1
[root@localhost consul]#consul operator raft list-peers  #查看集群状态
Node             ID                   Address              State   Voter  RaftProtocol
consul-server01  192.168.10.100:8300  192.168.10.100:8300  leader  true   2
[root@localhost consul]#consul info | grep leader   #查看详细信息
	leader = true
	leader_addr = 192.168.10.100:8300

四、Consul部署(Client端101)

1、安装Gliderlabs/Registrator Gliderlabs/Registrator

容器服务自动加入nginx集群

[root@localhost ~]#docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=192.168.10.101 \
consul://192.168.10.100:8500

[root@localhost ~]#docker images
REPOSITORY               TAG       IMAGE ID       CREATED       SIZE
gliderlabs/registrator   latest    3b59190c6c80   8 years ago   23.8MB

[root@localhost ~]#docker ps -a
CONTAINER ID   IMAGE                           COMMAND                   CREATED          STATUS          PORTS     NAMES
b5e51ff66b89   gliderlabs/registrator:latest   "/bin/registrator --…"   26 minutes ago   Up 26 minutes             registrator

2、测试服务发现功能是否正常

[root@localhost ~]#systemctl restart docker
[root@localhost ~]#docker run -itd -p 81:80 --name nginx-01 -h nginx01 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete 
a9edb18cadd1: Pull complete 
589b7251471a: Pull complete 
186b1aaa4aa6: Pull complete 
b4df32aa5a72: Pull complete 
a0bcbecc962e: Pull complete 
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
1d0a12637bf72a9e8c72f378ffbd62a6a35539890bcc5a09ee2903a5c8fae9da

[root@localhost ~]#docker run -itd -p 82:80 --name  nginx-02 -h nginx02 nginx
de7829ee539dc4fbf1a4a358ce5e875bfd6db0559478a12227bde87710fb35ed

[root@localhost ~]#docker run -itd -p 83:80 --name apache-01 -h apache01 httpd
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
b0a0cf830b12: Pull complete 
851c52adaa9b: Pull complete 
4f4fb700ef54: Pull complete 
39d9f60535a6: Pull complete 
943a2b3cf551: Pull complete 
ea83e81966d6: Pull complete 
Digest: sha256:36c8c79f900108f0f09fd4148ad35ade57cba0dc19d13f3d15be24ce94e6a639
Status: Downloaded newer image for httpd:latest
626cdd4ccff30bdfa49f8818e984ebeaf6e09ab898e41ce859162c43c8201fc0
[root@localhost ~]#docker run -itd -p 84:80 --name apache-02 -h apache02 httpd
9b5a30bf4257bf09665d7376f49e68cd8b2db95543c6ee174a8d57ab440706a9
[root@localhost ~]#docker images 
REPOSITORY               TAG       IMAGE ID       CREATED       SIZE
httpd                    latest    67c2fc9e3d84   3 weeks ago   147MB
nginx                    latest    605c77e624dd   2 years ago   141MB
gliderlabs/registrator   latest    3b59190c6c80   8 years ago   23.8MB

[root@localhost ~]#docker ps -a
CONTAINER ID   IMAGE                           COMMAND                   CREATED             STATUS          PORTS                               NAMES
9b5a30bf4257   httpd                           "httpd-foreground"        9 minutes ago       Up 9 minutes    0.0.0.0:84->80/tcp, :::84->80/tcp   apache-02
626cdd4ccff3   httpd                           "httpd-foreground"        12 minutes ago      Up 12 minutes   0.0.0.0:83->80/tcp, :::83->80/tcp   apache-01
de7829ee539d   nginx                           "/docker-entrypoint.…"   17 minutes ago      Up 17 minutes   0.0.0.0:82->80/tcp, :::82->80/tcp   nginx-02
1d0a12637bf7   nginx                           "/docker-entrypoint.…"   22 minutes ago      Up 22 minutes   0.0.0.0:81->80/tcp, :::81->80/tcp   nginx-01
b5e51ff66b89   gliderlabs/registrator:latest   "/bin/registrator --…"   About an hour ago   Up 24 minutes                                       registrator

3、验证 http 和 nginx 服务是否注册到 consul

浏览器中,输入 http://192.168.10.100:8500,在 Web 页面中“单击 NODES”,然后单击“consurl-server01”,会出现 5 个服务。

1.验证nginx服务

五、Consul-Template

Consul-Template是基于Consul的自动替换配置文件的应用。Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行 shell 命令执行更新操作,重新加载 Nginx。

Consul-Template可以查询Consul中的服务目录、Key、Key-values 等。这种强大的抽象功能和查询语言模板可以使 Consul-Template 特别适合动态的创建配置文件。例如:创建Apache/Nginx Proxy Balancers 、 Haproxy Backends等。

1、配置template自动更新

Server端

[root@localhost ~]#cd /opt/consul/
[root@localhost consul]#ls
consul_0.9.2_linux_amd64.zip

[root@localhost consul]#vim nginx.ctmpl

#定义nginx upstream一个简单模板
upstream http_backend {
  {{range service "nginx"}}
   server {{.Address}}:{{.Port}};
   {{end}}
}

#定义一个server,监听8000端口,反向代理到upstream
server {
    listen 8000;
    server_name localhost 192.168.10.100;
    access_log /var/log/nginx/hg.com-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;
    }
}
#保存退出

2、编译安装nginx

[root@localhost consul]#yum install  -y pcre-devel zlib-devel gcc gcc-c++ make
[root@localhost consul]#useradd  -M -s /sbin/nologin nginx
[root@localhost consul]#cd /opt/
[root@localhost opt]#rz -E  #上传nginx软件包
rz waiting to receive.
[root@localhost opt]#tar zxf nginx-1.12.0.tar.gz 
[root@localhost opt]#cd /opt/nginx-1.12.0/
[root@localhost nginx-1.12.0]#./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make -j && make install
[root@localhost nginx-1.12.0]#ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

3、配置nginx

[root@localhost nginx-1.12.0]#vim /usr/local/nginx/conf/nginx.conf

include vhost/*.conf;
#保存退出
[root@localhost nginx-1.12.0]#mkdir /usr/local/nginx/conf/vhost   #创建虚拟主机目录
[root@localhost nginx-1.12.0]#mkdir /var/log/nginx   #创建日志文件目录
[root@localhost nginx-1.12.0]#/usr/local/nginx/sbin/nginx   #启动nginx
[root@localhost nginx-1.12.0]#netstat -natp | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      9736/nginx: master  
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1280/master         
tcp6       0      0 ::1:25                  :::*                    LISTEN      1280/master    

4、配置并启动 template

[root@localhost consul]#rz -E          ##上传所需要的包
rz waiting to receive.
[root@localhost consul]#ls
consul_0.9.2_linux_amd64.zip  consul-template_0.19.3_linux_amd64.zip  nginx-1.12.0  nginx-1.12.0.tar.gz  nginx.ctmpl
[root@localhost consul]#unzip consul-template_0.19.3_linux_amd64.zip      解压consul-template
Archive:  consul-template_0.19.3_linux_amd64.zip
  inflating: consul-template         
[root@localhost consul]#ls
consul_0.9.2_linux_amd64.zip  consul-template_0.19.3_linux_amd64.zip  nginx-1.12.0.tar.gz
consul-template               nginx-1.12.0                            nginx.ctmpl
[root@localhost consul]#mv consul-template /usr/local/bin/
[root@localhost consul]#ls /usr/local/bin/
consul  consul-template  docker-compose

[root@localhost consul]#consul-template --consul-addr 192.168.10.100:8500 \
--template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/hg.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info

在开一个终端

[root@localhost ~]#cat /usr/local/nginx/conf/vhost/hg.conf 

5、验证template-nginx负载结果

docker ps 
#查看启动的容器信息
 
[root@localhost ~]#docker exec -it nginx-01 /bin/bash
root@nginx01:/# echo "this is nginx01" > /usr/share/nginx/html/index.html
root@nginx01:/# exit

[root@localhost ~]#docker exec -it nginx-02 /bin/bash
root@nginx02:/# echo "this is nginx02" > /usr/share/nginx/html/index.html 
root@nginx02:/# exit
 
#分别进入2个微服务容器即2个nginx和2个http,更换主页内容
浏览器访问:http://192.168.10.100:8000/并不断刷新,会有2种结果是更换后的nginx主页内容

浏览器访问:http://192.168.10.100:8000,并不断刷新

实现了template-nginx负载结果

6、测试微服务变动consul-template是否生效

①在Registrator服务器增加一个 nginx 容器节点,测试服务发现及配置更新功能

[root@localhost ~]#docker run -itd -p:85:80 --name nginx-03 -h nginx03 nginx
115fc71f5cd4c545dc19ef8ebc05f096277cf85978e10d43f69a256f601f1286

②观察 Consul服务器的template 服务,会从模板更新/usr/local/nginx/conf/vhost/hg.conf 文件内容,并且重载 nginx 服务

可以去浏览器查看

 

③查看三台 nginx 容器日志,请求正常轮询到各个容器节点上

[root@localhost ~]#docker logs -f nginx-01
[root@localhost ~]#docker logs -f nginx-02
[root@localhost ~]#docker logs -f nginx-03

④如果容器宕机,再去查看

[root@localhost ~]#docker ps -a 
CONTAINER ID   IMAGE                           COMMAND                   CREATED          STATUS          PORTS                               NAMES
a81e0afde976   nginx                           "/docker-entrypoint.…"   20 minutes ago   Up 20 minutes   0.0.0.0:85->80/tcp, :::85->80/tcp   nginx-03
fada625bd98e   gliderlabs/registrator:latest   "/bin/registrator --…"   40 minutes ago   Up 40 minutes                                       registrator
9b5a30bf4257   httpd                           "httpd-foreground"        7 hours ago      Up 7 hours      0.0.0.0:84->80/tcp, :::84->80/tcp   apache-02
626cdd4ccff3   httpd                           "httpd-foreground"        7 hours ago      Up 7 hours      0.0.0.0:83->80/tcp, :::83->80/tcp   apache-01
de7829ee539d   nginx                           "/docker-entrypoint.…"   7 hours ago      Up 7 hours      0.0.0.0:82->80/tcp, :::82->80/tcp   nginx-02
1d0a12637bf7   nginx                           "/docker-entrypoint.…"   7 hours ago      Up 7 hours      0.0.0.0:81->80/tcp, :::81->80/tcp   nginx-01
[root@localhost ~]#docker stop nginx-01
nginx-01
[root@localhost ~]#docker stop nginx-03
nginx-03

如果一个nginx容器和一个httpd容器宕机,查看变化

浏览器查看

怎么刷新都剩nginx02了

consul服务器查看,宕机的nginx的ip 和端口号就会被去掉

⑤如果再开启容器,查看下情况

 consul服务器查看

 浏览器查看

六、consul 多节点

新加入服务器

192.168.10.102

运行docker容器、consul服务

添加一台已有docker环境的服务器,192.168.10.102/24加入已有的群集中

[root@localhost ~]#yum install -y yum-utils device-mapper-persistent-data lvm2
[root@localhost ~]#yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@localhost ~]#yum install -y docker-ce docker-ce-cli containerd.io
[root@localhost ~]#systemctl  start docker.service
[root@localhost ~]#systemctl enable docker.service
[root@localhost ~]#systemctl  status docker.service

进入consul服务器把它拷贝到新加入的机器中

[root@localhost ~]#scp /usr/local/bin/consul 192.168.10.102:/usr/local/bin/

新加入机器(192.168.10.102)上操作

[root@localhost ~]#consul agent \
-server \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.10.102 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true  \
-datacenter=dc1  \
-join 192.168.10.100 &> /var/log/consul.log &

[1] 2374

[root@localhost ~]#ss -natp | grep consul

LISTEN     0      128    192.168.10.102:8300                     *:*                   users:(("consul",pid=2374,fd=3))
LISTEN     0      128    192.168.10.102:8301                     *:*                   users:(("consul",pid=2374,fd=10))
LISTEN     0      128    192.168.10.102:8302                     *:*                   users:(("consul",pid=2374,fd=7))
ESTAB      0      0      192.168.10.102:8300               192.168.10.100:47434               users:(("consul",pid=2374,fd=14))
ESTAB      0      0      192.168.10.102:8300               192.168.10.100:57454               users:(("consul",pid=2374,fd=19))
ESTAB      0      0      192.168.10.102:40415              192.168.10.100:8300                users:(("consul",pid=2374,fd=13))
LISTEN     0      128         :::8500                    :::*                   users:(("consul",pid=2374,fd=18))
LISTEN     0      128         :::8600                    :::*                   users:(("consul",pid=2374,fd=17))

  • -enable-script-checks=true :设置检查服务为可用
  • -datacenter : 数据中心名称
  • -join :加入到已有的集群中
  • -server:将 Consul 代理配置为服务器模式。
  • -ui:启用 Consul 的 Web 用户界面。
  • -data-dir=/var/lib/consul-data:指定 Consul 数据目录的位置。
  • -bind=192.168.10.102:绑定 Consul 代理的地址为 192.168.10.102。
  • -client=0.0.0.0:允许所有 IP 地址访问 Consul 代理。
  • -node=consul-server02:设置 Consul 代理的节点名称为 consul-server02。
  • -enable-script-checks=true:启用脚本检查功能。
  • -datacenter=dc1:设置数据中心名称为 dc1。
  • -join 192.168.10.100:加入另一个 Consul 节点,其 IP 地址为 192.168.10.100。
  • &> /var/log/consul.log &:将 Consul 的日志输出到 /var/log/consul.log 文件,并在后台运行 Consul 代理。
[root@localhost ~]#consul members
Node             Address              Status  Type    Build  Protocol  DC
consul-server01  192.168.10.100:8301  alive   server  0.9.2  2         dc1
consul-server02  192.168.10.102:8301  alive   server  0.9.2  2         dc1
[root@localhost ~]#consul operator raft list-peers
Node             ID                   Address              State     Voter  RaftProtocol
consul-server01  192.168.10.100:8300  192.168.10.100:8300  leader    true   2
consul-server02  192.168.10.102:8300  192.168.10.102:8300  follower  true   2

总结

所有以.sock结尾的文件都是应用的数据连接文件

1、启动consul后默认会监听的5个端口

8300:集群内部数据的读写和复制
8301:单个数据中心gossip协议通讯
8302:夸数据中心gossip协议通讯
8500:提供获取服务列表,注册服务,注销服务等HTTP接口:提供UI服务
8600:采用DNS协议提供服务发现功能

2、Consul用来解决什么问题

如果后端有大规模的服务节点集群是配置麻烦的问题
每次后端服务网络位置变化都需要人工修改前端调度器配置的问题

3、服务的自动发现和注册 consul

registrator 发现应用的网站位置,并发送给 consul server 的自动发现模块进行注册

4、Consul Agent (Server/Client)

consul_client 收集自动发现的信息,将所有需要注册的信息转发到server节点,不持久化这些信息
consul_server 持久化所有信息到本地,通过server-leader将信息同步给其他的server节点,以及各个节点的健康测试
consul-template 基于consul的注册的信息自动替换配置文件

  • 22
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值