Docker容器-----Consul(注册中心)部署

前言

Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置
Docker等轻量级容器可无缝配合

一、Docker consul(注册中心)

1、什么是consul

Consul是HashiCorp公司推出的开源工具,consul包含很多组件,但总体来说,consul是用于实现分布式系统的服务发现、服务配置的方案。

2、consul干什么

consul可以作为注册中心和配置中心,同时consul与其他注册中心一样,提供了一定的存储能力(存放注册者的信息),同时consul可以对集群中的节点进行监控检查实现故障排除。

1、服务发现:consul提供了通过DNS或者http接口的方式来注册服务和发现服务。一些外部的服务通过consul很容易的找到它所依赖的服务。

2、健康检查:consul的client提供健康检查机制,可以用来避免流量被转发到有故障的节点上。

3、KV存储:应用程序可以根据自己的需要使用consul提供key/value存储。consul提供了简单易用的http接口,结合其他工具可以实现动态配置、功能标记、leader选举等。

4、多数据中心:consul提供了多数据中心机制。这样就可以不用再创建多用的虚拟层来应用多个分区。

5、安全服务通信:consul可以为服务生成和分发TLS证书已建立相互TLS连接。Intentions可以用于定义允许通信的服务。可以通过实时更改的instentions来管理服务隔离,而不需复杂的网络拓扑和静态防火墙策略。

6、提供web的UI界面

​ 总结:consul是分布式的、高可用的一个服务管理工具,使用go语言编写,所以可移植性高,使用raft保证数分布式数据一致性及服务的高可用。consul内置了服务注和发现、分布一致性协议实现(采用raft算法)、健康检查、KV存储、多数据中心方案以及服务之间的安全通信。*每个consul服务提供节点,都运行一个consul agent(代理),consul agent并不意味着必须发现其它的服务,或者进行相应的数据操作,代理只需要对健康检查负责。代理连接一个或者多个consul服务端,consul服务端存储,复制数据,选取leader。虽然consul服务端可以单例运行,但是通过建议部署3到5个实例集群运行,以防止数据丢失,同时保证server-leader的选择能够正确的进行。

​ Raft算法属于Multi-Paxos算法,它是在Multi-Paxos思想的基础上,做了一些简化和限制,比如增加了日志必须是连续的,只支持领导者、跟随者和候选人三种状态,在理解和算法实现上都相对容易许多。从本质上说,Raft算法是通过一切以领导者为准的方式,实现一系列值的共识和各节点日志的一致。

3、Consul概述

① template 模板(更新)
② registrator(自动发现)
③ 后端每构建出一个容器,会向registrator进行注册,控制consul 完成更新操作,consul会触发consul template模板进行热更新
④ 核心机制:consul :自动发现、自动更新,为容器提供服务(添加、删除、生命周期)

4、Consul的特性

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

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

③ 支持ACL访问控制

5、Consul的使用场景

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

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

 二、consul集群

建立Consul服务

每个服务的节点上都要部署和运行Consul的agent

Consul agent有两种运行模式

Server

Client

4.1、server部署(192.168.80.10)

mkdir /mnt/consul

cd /mnt/consul

consul_0.9.2_linux_amd64.zip  上传安装包

unzip consul_0.9.2_linux_amd64.zip 解压

mv consul /usr/bin  将解压的文件移动到环境变量
 

consul agent \  #初始化
-server \
-bootstrap \
-ui \   #ui界面
-data-dir=/var/lib/consul-data \   #数据存储位置
-bind=192.168.80.10 \  #绑定地址
-client=0.0.0.0 \        #监听所有地址
-node=consul-server01 &> /var/log/consul.log &   #后台运行

consul members   #插入集群成员
consul info | grep leader   #查看leader信息

查看集群server成员    curl 127.0.0.1:8500/v1/status/peers
集群Raf leader     curl 127.0.0.1:8500/v1/status/leader
注册的所有服务   curl 127.0.0.1:8500/v1/catalog/services
查看nginx服务信息   curl 127.0.0.1:8500/v1/catalog/nginx
集群节点详细信息    curl 127.0.0.1:8500/v1/catalog/nodes

2、client部署(192.160.80.20)

容器服务自动加入nginx集群
1、安装Gliderlabs/Registrator Gliderlabs/Registrator
可检查容器运行状态自动注册,还可注销docker容器的服务 到服务配置中心
目前支持Consul、Etcd和SkyDNS2

在192.168.80.20节点上,执行以下操作

docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
-ip=192.168.80.20 \
consul://192.168.80.10:8500

 systemctl restart docker
docker run -itd -p:81:80 --name test-01 -h test01 nginx
docker run -itd -p:82:80 --name test-02 -h test02 nginx
docker run -itd -p:83:80 --name test-03 -h test03 httpd
docker run -itd -p:84:80 --name test-04 -h test04 httpd

 

 

 真机访问http://192.168.80.10:8500
此时应该可以发现5个服务 

 

 真机访问http://192.168.80.10:8500
此时应该可以发现5个服务 

3、server端配置template模板自动更新

Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件,更新完成以后,可以查询Consul中的服务目录,Key、Key-values等。

3.1 配置 nginx.ctmpl 文件

##在consul上操作
vim /mnt/consul/nginx.ctmpl

upstream http_backend {
  {{range service "nginx"}}
   server {{.Address}}:{{.Port}};   #此处引用的变量会指向后端的地址和端口(动态变化)
   {{end}}
}

server {
  listen 100;  #监听端口
  server_name localhost 192.168.80.10;        #反向代理的IP地址(前端展示的NG服务的IP)
  access_log /var/log/nginx/gg.com-access.log;
  index index.html index.php;
  location / {
    proxy_set_header HOST $host;
    proxy_set_header X-Real-IP $remote_addr;        #后端真实IP
    proxy_set_header Client-IP $remote_addr;    
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    #转发地址
    proxy_pass http://http_backend;   #反向代理调用
  }
}
 

  

3.2 编译安装nginx修改文件并启动

由于之前安装好nginx服务,所以不需要再次安装

可以不需要安装

yum install gcc pcre-devel zlib-devel -y

tar zxvf nginx-1.12.0.tar.gz  -C /opt

./configure --prefix=/usr/local/nginx

make && make install

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin

配置nginx服务的文件

vim /usr/local/nginx/conf/nginx.conf
在http模块下插入 

include vhost/*.conf; #添加虚拟主机目录(consul动态生成的配置文件就会放在这里)

 

3.3、配置并启动 template

cd /mnt/consul

上传 consul-template_0.19.3_linux_amd64.zip 

unzip consul-template_0.19.3_linux_amd64.zip #解压

mv consul-template /usr/bin/

##关联nginx 虚拟目录中的子配置文件操作    #启动日志监控
consul-template -consul-addr 192.168.80.10:8500 \
-template "/mnt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/gg.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info

 

 

 再打开另一个终端

cat /usr/local/nginx/conf/vhost/gg.conf

 

3.4、在client端 增加一个nginx容器节点

增加一个 nginx 容器节点,测试服务发现及配置更新功能
//在registrator服务端注册
docker run -itd -p 85:80 --name test-05 -h test05 nginx

 

 

在server端查看信息情况

consul-template -consul-addr 192.168.80.10:8500 \
-template "/mnt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/gg.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info

cat /usr/local/nginx/conf/vhost/gg.conf 

 

 浏览器访问 192.168.80.10查看新添加的容器信息

 

4、测试访问代理服务器

是否可以完成代理访问轮询

浏览器访问192.168.80.10:100 多次刷新产生日志

在client端查看日志信息

docker logs -f test-01

docker logs -f test-02

docker logs -f test-05

#注意需要启动日志监控
consul-template -consul-addr 192.168.80.10:8500 \
-template "/mnt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/gg.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用 `-v` 参数将配置文件挂载到 Docker 容器中,然后在容器内部使用相对路径或绝对路径读取配置文件。例如: ``` docker run -v /path/to/config:/app/config myimage ``` 这会将本地的 `/path/to/config` 目录挂载到容器内部的 `/app/config` 目录下。然后在容器内部,可以使用 `/app/config` 目录下的配置文件。 ### 回答2: Docker 是一个开源的容器化平台,一种轻量级的虚拟化技术。它通过将应用程序及其依赖项打包到一个可移植的容器中,实现了应用程序的跨平台、可移植性和高效运行。 在 Docker 中,可以使用 `-e` 参数来传递环境变量给容器。环境变量是一种在操作系统中存储的动态值,可以在应用程序中通过读取这些环境变量来获取相应的配置信息。在 Docker 中,通过 `-e` 参数可以将配置信息作为环境变量传递给容器,从而使容器在运行时能够读取这些配置信息。 然而,并不是所有的配置信息都适合通过环境变量传递给容器。有时候,我们可能需要将配置信息存储在一个文件中,并在容器启动时读取这个配置文件。这种方式有以下几个优势: 1. 灵活性:通过将配置信息存储在文件中,可以轻松地修改和管理配置,而不需要重新构建和部署容器。 2. 安全性:将敏感的配置信息存储在配置文件中,可以更好地保护这些信息,避免直接暴露在环境变量中。 3. 维护性:当有多个容器需要使用相同的配置信息时,通过将配置文件共享给这些容器,可以更方便地管理和更新配置。 要在 Docker 容器中读取配置文件,我们可以将配置文件挂载到容器的指定路径,并在容器启动时通过指定配置文件的路径来读取配置。例如,我们可以使用 `-v` 参数将本地的配置文件挂载到容器中的指定路径,然后在容器中读取这个配置文件。 总之,虽然在 Docker 中可以通过 `-e` 参数传递环境变量来读取配置信息,但并不是所有的配置都适合通过这种方式传递。有时候,我们需要将配置信息存储在一个文件中,并在容器启动时读取这个配置文件,从而获得更大的灵活性、安全性和维护性。 ### 回答3: Docker 是一种容器化技术,可以将应用程序及其依赖打包成一个独立的、可移植的容器,并在不同的环境中快速部署和运行。通常情况下,我们可以使用环境变量(-e)来传递应用程序的配置信息。 但是,有时候在实际应用中,直接使用 -e 参数传递配置信息可能不太方便或者不够灵活。这时可以选择不使用 -e 参数读取配置文件。不使用 -e 参数读取配置文件的方法有以下几种: 1. 挂载配置文件:将配置文件挂载到容器内部的某个目录,然后在容器中读取该目录下的配置文件。 例如,可以使用以下命令将主机的配置文件挂载到容器的 /config 目录下: ``` docker run -v /host/config/file:/config my-image ``` 在容器内部,可以通过读取 /config 目录下的配置文件获取配置信息。 2. 使用 Dockerfile:在构建镜像的过程中,可以将配置文件复制到镜像中,并在容器启动时读取该配置文件。 可以在 Dockerfile 中使用 COPY 命令将配置文件复制到镜像中的指定位置,然后在容器中读取该文件。 3. 使用配置管理工具:可以使用配置管理工具(如 Consul、etcd 等)来管理配置信息,然后在容器启动时从配置管理工具中获取配置。 这些工具可以集中管理配置信息,并提供 API 接口供应用程序读取。在容器启动时,应用程序通过调用 API 接口获取配置信息。 综上所述,Docker 不一定需要使用 -e 参数来读取配置文件。可以通过挂载配置文件、使用 Dockerfile 或配置管理工具等方式读取配置文件,以实现更加灵活和方便的配置管理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值