使用Docker-Compose搭建consul集群环境

目录

  • 一、概述
    • 1. Compose 简介
    • 2. Docker Compose容器编排
    • 3. Docker Compose配置常用字段
    • 4. Docker Compose常用命令
  • 二、Consul 概述
    • 1. Consul 简介
    • 2. Consul 特性
    • 3. Consul容器服务更新与发现
  • 三、部署 Compose
    • 1. 下载compose
    • 2. 编写dockerfile文件
    • 3. 编写docker-compose.yml文件
  • 四、部署 consul
    • 1. consul 服务器
    • 2. 通过 htppd api 获取集群信息
    • 3. 容器服务自动加入 consul 集群
      • 3.1 安装Gliderlabs/Registrator(server端)
      • 3.2 测试发现功能是否正常
    • 4. 安装consul-template
      • 4.1 准备template nginx 模板文件
      • 4.2 编译安装 nginx
      • 4.3 配置 nginx
    • 5. 配置 template
    • 6. 增加一个nginx容器节点,测试服务器发现以及配置更新功能


一、概述

1. Compose 简介

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

2. Docker Compose容器编排

  • YAML 是一种标记语言很直观的数据序列化格式
  • 文件格式及编写注意事项:
    ① 不支持制表符 tab 键缩进,需要使用空格缩进
    ② 通常开头缩进2个空格
    ③ 符号字符后缩进一个空格,如冒号“:”、逗号“,”、横杠“-”等
    ④ 用 # 号注释
    ⑤ 如果包含特殊字符用单引号弓|起来
    ⑥ 布尔值必须用引号括起来

3. Docker Compose配置常用字段

字段 描述
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 容器主机名

4. Docker Compose常用命令

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

二、Consul 概述

1. Consul 简介

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

2. Consul 特性

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

3. Consul容器服务更新与发现

使用Docker-Compose搭建consul集群环境_第1张图片

  • 两个nginx之间做keepalived,访问的时候通过httpd的方式访问keepalived,访问到nginx的主服务器,并且这个主服务器会代理给后端服务器上的Container,Container上面可以跑 tomcat/php/apache 等服务。
  • 发现:
    Consul会在docker服务器上安插一个眼线(registrator),它会自己去探测当前主机上容器的状态变化(增加和减少),并且可以自己去进行调整。
    当发现容器变化了以后,会把变化的信息告诉consul的server端并且注册到consul的server端,注册以后在UI界面可以在web网页里面查看节点的变化。
  • 更新:
    Consul agent控制consul template模板,使用template组件去和nginx.conf来进行对接,使用template这种方式来构建模板,模板里面都是变量,引用变量的方式去加载后端由consul注册到server端之后,server会把这个信息告诉agent,agent会和template进行对接并写入template中,更新完以后它会作为nginx.conf的子配置文件被前端的nginx所识别,最后consul agent 会控制nginx来进行reload,reload后会识别到nginx.conf配置文件中upstream池和proxy_pass信息的变化,也就是说可以识别后端的节点,这样就可以在地址池中动态的调整后端的资源。

三、部署 Compose

  • 案例环境

所有主机安装docker环境

主机 所需软件
192.168.8.19 docker、concul、agent/server/template、nginx手工编译安装
192.168.8.20 docker、nginx、httpd

1. 下载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
或
直接上传docker_compose包

chmod +x docker-compose	 
cp -p docker-compose /usr/local/bin	
mkdir /root/compose_nginx
cd compose_nginx/
mkdir nginx wwwroot

2. 编写dockerfile文件

cd nginx
上传nginx-1.12.2.tar.gz压缩包

vim Dockerfile
#复制下面的内容并写进去
FROM centos:7
ADD nginx-1.12.2.tar.gz /mnt 
WORKDIR /mnt/nginx-1.12.2
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && \
 yum clean all && \
 sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && \
 ./configure --prefix=/usr/local/nginx &> /dev/null && \
 make &> /dev/null && make install &> /dev/null &&\
 rm -rf /mnt/nginx-1.12.2
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
---------------------------------------------------------------------------------------------
cd wwwroot
vim index.html		 
hello world

3. 编写docker-compose.yml文件

vim /root/compose_nginx/docker-compose.yml

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

docker-compose -f docker-compose.yml up -d		 			#基于yml文件运行启动
docker-compose ps	 										#使用Compose容器编排

使用Docker-Compose搭建consul集群环境_第2张图片
使用Docker-Compose搭建consul集群环境_第3张图片

使用Docker-Compose搭建consul集群环境_第4张图片
使用Docker-Compose搭建consul集群环境_第5张图片

四、部署 consul

  • 案例环境
主机 操作系统 主机名/IP地址 主要软件及版本
服务器 Centos 7.4-x86_64 consul/192.168.8.19 Docker、Compose、Consul、Consul-template
服务器 Centos 7.4-x86_64 registrator/192.168.8.20 Docker、registrator

1. consul 服务器

cd /opt/
mkdir consul
cd consul/
#上传consul_0.9.2_linux_amd64.zip压缩包
unzip consul_0.9.2_linux_amd64.zip 
mv consul /usr/local/bin/							#移动到/usr/bin目录相当于可以直接被系统使用

consul agent \   				 					#构建agent功能
> -server \     				 					#server模式  
> -bootstrap \										#前端框架
> -ui \												#可被访问的web页面
> -data-dir=/var/lib/consul-data \
> -bind=192.168.8.19 \
> -client=0.0.0.0 \        							#监听客户端所有地址
> -node=consul-server01 &> /var/log/consul.log &


consul members		 								#查看集群信息
consul info | grep leader
consul agent \   				 					
-server \     				 					
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.8.19 \
-client=0.0.0.0 \        							
-node=consul-server01 &> /var/log/consul.log &

使用Docker-Compose搭建consul集群环境_第6张图片

2. 通过 htppd 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  						#集群节点详细信息

使用Docker-Compose搭建consul集群环境_第7张图片

3. 容器服务自动加入 consul 集群

3.1 安装Gliderlabs/Registrator(server端)

可检查容器运行状态自动注册,还可以注销docker容器的服务 到服务配置中心,目前支持 Consul、Etcd和SkyDNS2

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

使用Docker-Compose搭建consul集群环境_第8张图片

3.2 测试发现功能是否正常

docker run -itd -p 83:80 --name test-1 -h test1 nginx
docker run -itd -p 84:80 --name test-2 -h test2 nginx
docker run -itd -p 88:80 --name test-3 -h test3 httpd
docker run -itd -p 89:80 --name test-4 -h test4 httpd
  • 验证http和nginx服务是否注册到consul,在浏览器中输入 http://192.168.8.19:8500 点击 “NODES”,然后点“consul-server”,会出现5个服务

使用Docker-Compose搭建consul集群环境_第9张图片

  • 在consul服务器上查看
curl 127.0.0.1:8500/v1/catalog/services

使用Docker-Compose搭建consul集群环境_第10张图片

4. 安装consul-template

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

4.1 准备template nginx 模板文件

在consul/192.168.8.19上进行操作

vim /root/consul/nginx.ctmpl		

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

server {
  listen 83;		 							#ngixn的监听端口
  server_name localhost 192.168.8.19;			#反向代理的IP地址(前端展示的NG服务的IP)
  access_log /var/log/nginx/klj.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;
  }
}
upstream http_backend {
  {{range service "nginx"}}
   server {{.Address}}:{{.Port}};                       
   {{end}}
}

server {
  listen 83;                                                                    
  server_name localhost 192.168.8.19;                   
  access_log /var/log/nginx/klj.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;
  }
}

4.2 编译安装 nginx

#上传压缩包nginx-1.12.2.tar.gz
yum install gcc pcre-devel zlib-devel -y
tar zxvf nginx-1.12.2.tar.gz  -C /opt
cd nginx-1.12.2
./configure --prefix=/usr/local/nginx
make && make install

4.3 配置 nginx

vim /usr/local/nginx/conf/nginx.conf
http {
     include       mime.types;							#默认存在的
     include  vhost/*.conf;         					#添加虚拟主机目录为了让那个识别vhost/*.conf的文件(consul动态生成的配置文件就会放在这里)
     default_type  application/octet-stream;

mkdir /usr/local/nginx/conf/vhost		 				#创建虚拟主机目录
mkdir /var/log/nginx		 							#创建日志文件目录
ln -s /usr/local/nginx/sbin/nginx /usr/sbin
nginx		 

使用Docker-Compose搭建consul集群环境_第11张图片
使用Docker-Compose搭建consul集群环境_第12张图片

5. 配置 template

  • 解压 template 安装包
#上传 consul-template_0.19.3_linux_amd64.zip 包到/root 目录下

unzip consul-template_0.19.3_linux_amd64.zip		
mv consul-template /usr/bin/

使用Docker-Compose搭建consul集群环境_第13张图片

  • 关联 nginx 虚拟目录中的子配置文件操作
consul-template -consul-addr 192.168.8.19:8500 -template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/test.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info 	 

使用Docker-Compose搭建consul集群环境_第14张图片

  • 重新打开一个终端查看生成的配置文件
cat /usr/local/nginx/conf/vhost/test.conf 

使用Docker-Compose搭建consul集群环境_第15张图片

6. 增加一个nginx容器节点,测试服务器发现以及配置更新功能

在 registrator/192.168.8.20 服务端注册

docker run -itd -p 85:80 --name test-5 -h test5 nginx
  • 刷新之前先查看下85端口不存在

使用Docker-Compose搭建consul集群环境_第16张图片

使用Docker-Compose搭建consul集群环境_第17张图片

  • 增加节点以后刷新发现85端口出现
    使用Docker-Compose搭建consul集群环境_第18张图片

  • 同样,删除一个节点查看效果

使用Docker-Compose搭建consul集群环境_第19张图片

使用Docker-Compose搭建consul集群环境_第20张图片

你可能感兴趣的:(Docker,docker,consul,容器)