Docker容器—编排工具compose搭建consul集群

Docker编排工具:Compose

一、Compose理论

1.1 Compose概念

1、Docker Compose的前身是Fig。它是一个定义及运行多个(批量部署)Docker容器的工具

2、使用Docker Compose不再需要使用Shell脚本来启动容器

3、Docker Compose非常适合组合使用多个容器进行开发的场景

解析:Docker Compose是一个批量创建,运行容器的工具

Docker compose 使用的三个步骤:

① 使用Dokcerfile 定义应用程序的环境
② 使用docker-compose.yml 定义构成应用程序的服务,这样它们就可以再隔离环境中一起运行
③ 最后执行 docker-compose up 命令来启动并运行整个应用程序

1.2 Compose文件格式(YAML)

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

文件格式及编写注意事项

1、不支持制表符Tab键缩进,需要使用空格缩进;
2、通常开头缩进2个空格;
3、字符后缩进一个字符,如冒号、逗号、横杆 ;
4、用#号注释;
5、如果包含特殊字符用单引号引起来;
6、布尔值必须用引号括起来

1.3 Compose常用字段

在这里插入图片描述

1.4 Compose常用命令

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

2、docker-compose选项

–verbose:输出更多调试信息

–version:打印版本并退出

-f、–file FILE:使用特定的compose末班文件,默认为docker-compose.yml

-p、–project-name NAME:指定项目名称,默认使用目录名称

3、常用命令在这里插入图片描述

二、Compose案例部署(创建nginx镜像)

2.1 安装compose

(1)安装软件
[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
#可从网上下载数据包,也可直接导入该数据包

(2)配置compose环境
[root@localhost ~]# chmod 755 docker-compose
[root@localhost ~]# cp -p docker-compose /usr/local/bin/
[root@localhost ~]# docker-compose --version
docker-compose version 1.21.1, build 5a3f1a3

2.2 创建一个可以编排的nginx镜像文件夹

(1)创建文件夹
[root@localhost ~]# mkdir compose_nginx
[root@localhost ~]# cd compose_nginx/
[root@localhost compose_nginx]# mkdir nginx

(2)往nginx文件夹里导入nginx软件包
[root@localhost compose_nginx]# cd nginx/
[root@localhost nginx]# ls
nginx-1.12.0.tar.gz

(3)往nginx文件夹里写入run脚本
[root@localhost nginx]# vim run.sh
#启动脚本
#!/bin/bash
/usr/local/nginx/sbin/nginx

(4)往nginx文件夹里写入dockefile
[root@localhost nginx]# vim Dockerfile
FROM centos:7
MAINTAINER this is nginx image
RUN yum -y update
RUN yum -y install gcc gcc-c++ pcre-devel zlib-devel make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.0.tar.gz /usr/local/src
WORKDIR /usr/local/src/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"]

2.3 创建compose所需的文件

(1)编写nginx首页
[root@localhost compose_nginx]# mkdir wwwroot
[root@localhost compose_nginx]# cd wwwroot/
[root@localhost wwwroot]# vim index.html
hello world

(2)编写yml文件
[root@localhost compose_nginx]# vim docker-compose.yml
version: '3'
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 666:80
      - 888:443
    networks:
      - aaa
    volumes:
      - ./wwwroot:/usr/local/nginx/html
networks:
  aaa:
  
(3)下载tree文件,方便查看文件结构目录
[root@localhost compose_nginx]# yum -y install tree
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
......

已安装:
  tree.x86_64 0:1.6.0-10.el7                                                 

完毕!

[root@localhost compose_nginx]# tree ./  #查看当前目录结构
./
├── docker-compose.yml
├── nginx
│   ├── Dockerfile
│   ├── nginx-1.12.0.tar.gz
│   └── run.sh
└── wwwroot
    └── index.html

2 directories, 5 files

此时!编排nginx镜像所需的文件均已编辑完毕

2.4 编排

[root@localhost compose_nginx]# docker-compose -f docker-compose.yml up -d

.......
Step 15/15 : CMD ["/run.sh"]
 ---> Running in 288f88005c14
Removing intermediate container 288f88005c14
 ---> 700a5f1ab6cd
Successfully built 700a5f1ab6cd
Successfully tagged compose_nginx_nginx:latest
WARNING: Image for service nginx was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating compose_nginx_nginx_1 ... done

[root@localhost compose_nginx]# docker images  #镜像已创建成功
REPOSITORY            TAG       IMAGE ID       CREATED              SIZE
compose_nginx_nginx   latest    700a5f1ab6cd   6 minutes ago   602MB
centos                7         8652b9f0cb4c   4 months ago    204MB

[root@localhost compose_nginx]# docker ps -a   
CONTAINER ID   IMAGE                 COMMAND                  CREATED              STATUS                     PORTS                                       NAMES
09088ff6997f   compose_nginx_nginx   "/run.sh"   9 minutes ago   Up 9 minutes   0.0.0.0:666->80/tcp, 0.0.0.0:888->443/tcp   compose_nginx_nginx_1


测试:访问网页
[root@localhost compose_nginx]# curl localhost:666
hello world

Docker consul(容器服务的更新与发现)

三、Docker consul概念

consul是HashiCorp公司推出使用go语言编写的开源工具,用于实现分布式系统的服务发现与配置

特性:

1、consul支持健康检查,允许存储键值对

2、一致性协议采用Raft算法,用来保证服务的高可用

3、成员管理和消息广播采用GOSSIP协议,支持ACL访问控制

4、方便部署,与Docker等轻量级容器可无缝配合

3.1 Docker consul应用

现在企业应用都向微服务化方向发展,当把我们的系统功能拆分成一个一个的微服务后,存在以下问题:

1、 需要配置N个服务的网络位置,加大配置的复杂性

2、服务的网络位置变化,都需要改变每个调用者的配置

3、 集群的情况下,除了反向代理方式,难以做负载

3.2 构建高可用及自动发现的Docker服务架构

在这里插入图片描述
1、上方拓扑图是基于Docker完成的,然后将consul、consul template、registrator和nginx组装成一个值得信任且可扩展的服务框架,此架构可以灵活的、不需要重启任何服务、不需要重写任何配置的添加和移除服务

2、当后面容器增加时,registrator注册容器中的服务→通知consul server更新→consul template模板进行更新,自动修改nginx.conf中的upstream参数

3、Registrator监控新建的Docker容器,并且检查判定这些容器提供的服务。从我们的目的出发,任何监听在某个端口的程序都是服务。Registrator在容器内发现的任务服务,都将被添加到一个服务注册端,比如Consul或etcd

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

3.3 Consul的组件

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 的核心进程,Agent 的工作是维护成员关系信息、注册服务、健康检查、响应查询等等。Consul 集群的每一个节点都必须运行 agent 进程

四、部署Consul服务架构

案例环境

IP地址需要安装的软件
192.168.40.11Docker-ce 、Compose 3、Consul、Consul-template
192.168.40.12Docker-ce

原理

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

4.1 搭建 consul 集群

(1)配置 consul 服务器01:

(1)安装consul
[root@docker ~]# mkdir /root/consul
[root@docker ~]# cp consul_0.9.2_linux_amd64.zip /root/consul
[root@docker ~]# cd /root/consul
[root@docker consul]# unzip consul_0.9.2_linux_amd64.zip
Archive:  consul_0.9.2_linux_amd64.zip
  inflating: consul                  
[root@docker consul]# mv consul /usr/bin

(2)建立Consul 服务
consul agent \
-server \ #server功能
-bootstrap \ #选举为领袖
-ui \ #提供web访问界面
-data-dir=/var/lib/consul-data \ #参数存储位置
-bind=192.168.40.11 \ #绑定地址(本地)
-client=0.0.0.0 \ #所有节点终端
-node=consul-server01 &> /var/log/consul.log & #指定本地节点名称,日志输出位置,后台运行

(3)查看集群成员
[root@docker ~]# consul members
Node             Address         Status  Type    Build  Protocol  DC
consul-server01  192.168.40.11:8301  alive   server  0.9.2  2         dc1

[root@docker ~]# consul info | grep leader #查看集群节点老大
	leader = true
	leader_addr = 192.168.40.11:8300

(4)通过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 服务信息
[root@docker consul]# curl 127.0.0.1:8500/v1/catalog/nodes  //集群节点详细信息
[{"ID":"b1fff919-0e34-7a00-4021-d69ad6f6cd41","Node":"consul-server01","Address":"192.168.40.11","Datacenter":"dc1","TaggedAddresses":{"lan":"192.168.40.11","wan":"192.168.40.11"},"Meta":{},"CreateIndex":5,"ModifyIndex":6}]

(2)配置 consul 服务器02:

[root@docker2 ~]# docker run -d \
> --name=registrator \						    #下载registrator容器
> --net=host \							        #使用host网络
> -v /var/run/docker.sock:/tmp/docker.sock \	#数据卷挂载(使用的是系统默认的)
> --restart=always \						    #重启策略(遇到问题会重启)
> gliderlabs/registrator:latest \				#下载的仓库名称/镜像名称
> -ip=192.168.40.12 \						    #指向本地服务器IP地址
> consul://192.168.40.11:8500					#指向注册中心的地址

2. 创建两个nginx容器,两个apache容器
docker run -itd -p:83:80 --name test-01 -h test01 nginx
docker run -itd -p:84:80 --name test-02 -h test02 nginx
docker run -itd -p:88:80 --name test-03 -h test03 httpd
docker run -itd -p:89:80 --name test-04 -h test04 httpd

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

1、浏览器输入 http://192.168.40.12:8500
在这里插入图片描述
2、“单击 NODES”,然后单击 “consurl-server01”,会出现 4 个服务

在这里插入图片描述

3、在server01上查看服务

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

4.2 安装 consul-template

在consul服务器的consul目录中添加nginx模板

[root@docker consul]# vim nginx.ctmpl

upstream http_backend {								#群集模块模板
    {{range service "nginx"}}						#指定nginx服务项
     server {{.Address}}:{{.Port}};					#指向真实服务器的地址和端口“{{.Address}}” 此参数会根据consul群集的参数自动设置上去
     {{end}}						   			    #结束语句(以上为轮询请求方式)
}

server {
       listen 85;					                  #对外提供的端口,可自行设置,只要不起冲突
       server_name localhost 192.168.40.12;		      #本地反向代理的节点地址
       access_log /var/log/nginx/kgc.cn-access.log;	  #访问日志文件目录(需手动创建)
       index index.html index.php;			          #指定访问的index 首页类型
       location / {
          proxy_set_header HOST $host;				  #反向代理的请求头部信息
          proxy_set_header X-Real-IP $remote_addr;	  #真实服务器IP
          proxy_set_header Client-IP $remote_addr; 	  #客户IP
          proxy_set_header X-Fprwarded-For $proxy_add_x_forwarded_for;	#Forward转发地址
          proxy_pass http://http_backend;			  #反向代理指向upstream地址池
                 }
       }

4.3 手工编译安装nginx服务

[root@docker consul]# yum install gcc gcc-c++ pcre-devel zlib-devel -y

(1) 导入Nginx1.12.0软件包
[root@localhost consul]# ls
consul_0.9.2_linux_amd64.zip            nginx-1.12.0.tar.gz
consul-template_0.19.3_linux_amd64.zip  nginx.ctmpl

(2) 解压软件包
[root@docker consul]# tar zxvf nginx-1.12.0.tar.gz -C /opt

(3) 配置、编译
[root@docker consul]# cd /opt/nginx-1.12.0/
[root@docker nginx-1.12.0]# ./configure --prefix=/usr/local/nginx
[root@docker nginx-1.12.0]# make && make install

(4) 修改nginx配置文件
[root@docker nginx-1.12.0]# cd /usr/local/nginx/conf/
[root@docker conf]# vim nginx.conf    #在http模块下 添加include vhost/ *.conf

http {
    include       mime.types;
    include       vhost/ *.conf;			#vhost目录需手动创建

[root@docker conf]# mkdir vhost   #创建vhost文件目录

[root@docker conf]# mkdir /var/log/nginx  #创建nginx访问日志目录

[root@docker conf]# ln -s /usr/local/nginx/sbin/nginx /usr/bin #创建软链接并启动nginx

4.4 配置并启动 template

(1) 上传 consul-template_0.19.3_linux_amd64.zip 包到/root 目录下

[root@docker ~]# unzip consul-template_0.19.3_linux_amd64.zip

[root@docker ~]# mv consul-template /usr/bin/

[root@docker ~]# consul-template -consul-addr 192.168.40.11:8500 \
-template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/kgc.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info

(2) 参数详解:
-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”)

(3) 另外打开一个终端查看生成配置文件
[root@docker ~]# cat /usr/local/nginx/conf/vhost/kgc.conf 
upstream http_backend {				
    		
     server 192.168.40.12:83;		
     		
     server 192.168.40.12:84;		
     				
}

server {
       listen 85;		
       server_name localhost 192.169.40.12;
       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;	
                 }
       }

4.4 验证

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

[root@docker2 ~]# docker run -itd -p:85:80 --name test-05 -h test05 nginx
c5cce6a7c78396c299ddd70143138838e855a50e3ba13d79e0153e7ecca33691

[root@docker ~]# cat /usr/local/nginx/conf/vhost/kgc.conf 
upstream http_backend {
  
   server 192.168.40.12:83;		
     		
   server 192.168.40.12:84;
   
   server 192.168.40.12:85;
   
}

server {
  listen 85;
  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-Forwarded-For $proxy_add_x_forwarded_for;	
    proxy_pass http://http_backend;
  }
}

总结

Consul功能解析:

consul server定义,读取前端的配置模板后端的客户端部署registrator去监听本地集群是否出现扩展,如果出现扩展容器,会报告给consul server端,由consul agent代理去指定更新(前端的反向代理池)到模板文件中并同步到前端,保证前端对后端的动态识别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值