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服务器监控装填会有提示自动更新