docker-compose搭建consul集群

compose

概述

Docker Compose的前身是Fig。它是一个定义及运行多个(批量部署)Docker容器的工具
使用Docker Compose不再需要使用Shell脚本来启动容器
Docker Compose非常适合组合使用多个容器进行开发的场景
Docker Compose是一个批量创建,运行容器的工具
使用的三个步骤:
使用Dokcerfile 定义应用程序的环境
使用docker-compose.yml 定义构成应用程序的服务,这样它们就可以再隔离环境中一起运行
最后执行 docker-compose up 命令来启动并运行整个应用程序

文件格式(YAML)

YAML是一种标记语言很直观的数据序列化格式。

文件格式即编写注意事项
不支持表符tab键缩进,需要使用空格缩进
通常开头缩进2个空格
字符后缩进1个空格,如冒号,逗号,横杆
用#号注释
如果包含特殊字符用单引号引起来
布尔值必须用引号括起来

格式
多行缩进
数据结构可以用类似大纲的缩排方式呈现,结构通过缩进表示,连续的项目通过减号“-”来表示,map结构里面的key/value对用冒号“:”来分隔。

配置常用字段

字段 描述
build dockerfile context 指定Dockerfile文件名构建镜像上下文路径
image 指定镜像
command 执行命令,覆盖默认命令
container name 指定容器名称,由于容器名称是唯一-的, 如果指定自定义名称,则无法scale(建立副本)
deploy 指定部署和运行服务相关配置,只能在Swarm模式使用
environment 添加环境变量
networks 加入网络 (名称空间)
ports 暴露容器端口,与-p相同,但端口不能低于60
volumes 挂载宿主机路径或命令卷(数据卷)
restart 重启策略,默认no(失败,不会继续操作),always(失败,一直尝试重启,直到运行成功), no-failure,unless-stoped
hostname 容器主机名

常用命令

基本的命令格式:docker-compose [选项] [命令] [参数]

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

常用命令

字段 描述
build 重新构建服务
ps 列出容器
up 创建和启动容器
exec 在容器里面执行命令
scale 指定一个服务容器启动数量
top 显示容器进程
logs 查看容器输出
down 删除容器、网络、数据卷和镜像
stop/start/restart 停止/启动/重启服务

部署

基础安装环境可见 Docker-基本管理命令

安装compose

curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#可从网上下载数据包,也可直接导入该数据包

配置compose环境
cp -p docker-compose /usr/bin/
cd /usr/bin/
chmod +x docker-compose 
cd
mkdir compose_nginx

使用dockerfile创建nginx

cd compose_nginx/
mkdir nginx
cd nginx/

vim Dockerfile 
FROM centos:7
MAINTAINER this is nginx
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.0.tar.gz /usr/local/src
WORKDIR /usr/local/src
WORKDIR nginx-1.12.0
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"]

vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx

cd ..
mkdir web
cd web/
vim index.html
shuaige

yum -y install tree
tree

在这里插入图片描述

创建模板脚本

vim docker-compose.yaml
version: '3'
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 1234:80
      - 1235:443
    networks:
      - cluster
    volumes:
      - ./wr:/usr/local/nginx/html
networks:
 cluster:

docker-compose -f docker-compose.yaml up -d			#-d:守护进程
docker images
docker ps -a

在这里插入图片描述

访问http://20.0.0.14:1234
在这里插入图片描述

consul

概述

Consul是一个分布式、高可用的系统,是一个为了解决在生产环境中服务注册,服务发现,服务配置的一个工具。

特点
支持健康检查,允许存储键值对
基于Golong语言,可移植性强
支持ACL访问控制
与Docker等轻量级容器可无缝配合

组件

Client
表示 Consul 客户端模式,是 Consul 节点的一种模式,所有注册到 Client 节点的服务会被转发到 Server 。本身无状态不持久化如何数据。Client 通过 HTTP、DNS、GRPC 接口请求转发给局域网内的服务端集群。

Server
表示 Consul 的服务端模式, Server 功能和 Client 都一样,不同的是 Server 持久化数据到本地。在局域网内与本地 Client 通讯,通过广域网与其他数据中心通讯。每个数据中心的 Server 数量推荐为 3 个或是 5 个。

Server-leader
表示这个 Server 是它们的老大,它和其它 Server 不一样的一点是,它需要负责同步注册的信息给其它的 Server 节点,同时也要负责各个节点的健康监测。如果 Leader 宕机了,通数据中心的所有 Server 内部会使用 Raft 算法来在其中选取一个 Leader 出来。

Agent
Agent 是 Consul 的核心进程,是一个独立的程序,通过守护进程的方式,运行在consul集群中的每个节点上。Agent 的工作是维护成员关系信息、注册服务、健康检查、响应查询等等。Consul 集群的每一个节点都必须运行 agent 进程。

server 与 client 只是 consul 群集层面的区分,与搭建在 cluster 之上的应用服务无关。

ps:
Agent负责执行自己的健康检查和更新本地状态其中,Agent 根据节点的性质,分为:
Agent Server:
client将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群。
Agent Client:
server 保存client的注册信息,集群的配置信息, 维护集群高可用, 在局域网内与本地客户端通讯, 通过广域网与其它数据中心通讯。 每个数据中心的 server 数量推荐为 3 个或是 5 个,通过 Raft 算法来保证一致性。

原理

在分布式系统结构中,往往由成百上千的业务服务组成,为了容灾(节点宕机)、扩容(增加节点)、提高运维效率(动态配置)等原因,需要服务能够实现灵活发现,避免问题节点等功能,以提高系统稳定性

服务发现及注册
当服务Producer 启动时,会将自己的Ip/host等信息通过发送请求告知 Consul,Consul 接收到 Producer
的注册信息后,每隔一段时间会向 Producer 发送一个健康检查的请求,检验Producer是否健康。

服务调用
当 Consumer 请求Product时,会先从 Consul 中拿到存储Product服务的 IP 和 Port 的临时表(temp
table),从temp table表中任选一个· Producer 的 IP 和 Port,然后根据这个IP和Port,发送访问请求;temp table表只包含通过了健康检查的 Producer 信息,并且每隔一段时间更新

部署

环境

IP地址 安装的软件
20.0.0.14 Docker-ce 、Compose 3、Consul、Consul-template
20.0.0.15 Docker-ce、registrator

template 模板(更新)、registrator(自动发现)

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

部署consul

mkdir consul
cd consul/
unzip consul_0.9.2_linux_amd64.zip 
ls
mv consul /usr/bin/
ll /usr/bin | grep consul

consul agent \
-server \       #服务端
-bootstrap \	#前端框架
-ui \			#可被访问的web界面
-data-dir=/var/lib/consul-data \
-bind=20.0.0.14 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &  #混合输出并后台运行

查看集群

jobs  		#查看状态
consul members
consul info | grep leader

在这里插入图片描述

通过httpd api获取集群

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

在这里插入图片描述

容器服务自动加入consul集群

在20.0.0.15 节点,执行以下操作

docker run -d \
--name=registrator \			#下载registrator容器
--net=host \					#使用host网络
-v /var/run/docker.sock:/tmp/docker.sock \		#数据卷挂载(使用的是系统默认的)
--restart=always \				#重启策略(永远)
gliderlabs/registrator:latest \	#下载的仓库名称/镜像名称
-ip=20.0.0.15 \					#指向本地服务器IP地址
consul://20.0.0.14:8500			#指向注册中心的地址
docker images
docker ps -a                   

在这里插入图片描述
检测8500端口

netstat -natp | grep 8500

在这里插入图片描述
测试服务

[root@docker2 ~]# docker run -itd -p:112:80 --name test-02 -h test02 nginx
[root@docker2 ~]# docker run -itd -p:113:80 --name test-03 -h test03 httpd
[root@docker2 ~]# docker run -itd -p:114:80 --name test-04 -h test04 httpd

验证服务是否注册到consul

访问http://20.0.0.14:8500,点击NODES,然后consurl-server01
在这里插入图片描述
查看服务

curl 127.0.0.1:8500/v1/catalog/services

在这里插入图片描述

安装consul-template

简介

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

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

准备template nginx模板

[root@docker ~]# vim /root/consul/nginx.ctmpl

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

server {
    
    
  listen 112;
  server_name localhost 20.0.0.14;	#反向代理的IP地址
  access_log /var/log/nginx/kgc.cn-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;									#反向代理
  }
}

编译安装nginx

上传nginx-1.12.0.tar.gz

yum -y install gcc gcc-c++ pcre-devel zlib-devel
tar zxvf nginx-1.12.0.tar.gz 
cd nginx-1.12.0/
./configure --prefix=/usr/local/nginx
make && make install

修改nginx配置文件

cd /usr/local/nginx/conf/
vi nginx.conf

http {
    
    
   include       mime.types;
   include       vhost/*.conf;   
#19添加添加虚拟主机目录(consul动态生成的配置文件就会放在这里)可识别vhost文件中所有的.conf文件,兼容子配置文件  

mkdir /usr/local/nginx/conf/vhost	#创建vhost文件目录
mkdir /var/log/nginx				#创建nginx访问日志目录
/usr/local/nginx/sbin/nginx			#启动nginx

配置启动template

安装包上传到/root 目录下

unzip consul-template_0.19.3_linux_amd64.zip 
mv consul-template /usr/bin/
consul-template -consul-addr 20.0.0.14:8500 -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/test.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info

参数详解:
-consul-addr 20.0.0.14:8500:指向consul服务端节点
-template "/root/consul/nginx.ctmpl:指定模板路径
:/usr/local/nginx/conf/vhost/test.conf:指定文件生成到vhost中并命名为test.conf
:/usr/local/nginx/sbin/nginx -s reload:不中断服务reload重载nginx服务让配置文件生效
–log-level=info:产生日志,级别为info(日志生成位置在nginx.ctml中定义“access_log”)

查看生成配置文件

另开一个终端

cat /usr/local/nginx/conf/vhost/kgc.conf 
upstream http_backend {
    
    				
    		
     server 20.0.0.15:112;			
     				
}

server {
    
    
       listen 112;		
       server_name localhost 20.0.0.14;
       access_log /var/log/nginx/kgc.cn-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-Fprwarded-For $proxy_add_x_forwarded_for;
          proxy_pass http://http_backend;	
                 }
       }

验证

在后端服务器中再次添加一个容器,查看vhost中配置文件是否会自动发现

[root@docker2 ~]# docker run -itd -p:115:80 --name test-05 -h test05 nginx
[root@docker2 ~]# docker run -itd -p:116:80 --name test-06 -h test06 nginx

在consul服务器监控装填会有提示自动更新
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_50344742/article/details/115036854