Docker-compose容器编排,consul,consul-template

一. docker-compose

1.1 docker compose 容器编排概述

  • docker compose 的前身是Fig,它是一个定义及运行多个Docker容器的工具
  • 使用Docker Compose 不再需要使用shell脚本本来启动容器
  • Docker Compose 非常适合组合使用多个容器进行开发的changjing

1.2 Docker Compose 环境安装

[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
[root@localhost ~]# chmod +x /usr/local/bin/docker-compose
[root@localhost ~]# docker-compose-v

1.3 Docker Compose文件结构

[root@localhost compose_lnmp]# vim docker-compose.yml 
  • YAML是一种标记语言,很直观的数据序列化格式
  • 文件格式及编写注意事项
  1. 不支持制表符tab键缩进,需要使用空格锁进
  2. 通常开头缩进2个空格
  3. 字符后缩进一个空格,如冒号、逗号、横杠
  4. 用#号注释
  5. 如果包含特殊字符用单引号引起来
  6. 布尔值必须用括号括起来

1.4 Docker Compose配置常用字段

字段描述
build指定包含构建上下文的路径, 或作为一个对象,该对象具有 context 和指定的 dockerfile 文件以及 args 参数值
context指定 Dockerfile 文件所在的路径
dockerfile指定 context 指定的目录下面的 Dockerfile 的名称(默认为 Dockerfile)
image指定镜像
command执行命令,覆盖默认命令
container_name指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale
deploy指定部署的运行服务相关配置,只能在Swarm模式使用
environment添加环境变量
networks加入网络
ports暴露容器端口,与-p相同,但端口不能低于60
volumes挂载宿主机路径或命令卷
restart重启策略,默认no,always,no-failure,unless-stoped
hostname容器主机名

1.5 Docker Compose常用命令

字段描述
build重新构建服务
ps列出容器
up创建和启动容器
exec在容器里面执行命令
scale指定一个服务容器启动数量
top显示容器进程
logs查看容器输出
down删除容器,网络,数据卷和镜像
stop/start/restart停止/启动/重启服务
depends_on定义容器启动顺序 (此选项解决了容器之间的依赖关系
links链接到其它服务中的容器, 该选项是 docker 历史遗留的选项, 目前已被用户自定义网络名称空间取代, 最终有可能被废弃 (在使用 swarm 部署时将忽略该选项)
  • 基本的使用格式
    docker-compose [options] [COMMAND] [ATGS…]
  • docker-compose选项
  1. –verbose 输出更多调试信息
  2. –version 打印版本并退出
  3. -f , --file FILE 使用特定的compose 模板文件,默认为docker-compose.yml
  4. -p,–project-name NAME 指定项目名称,默认使用目录名称

1.6 使用Docker Compose编排nginx容器

Docker Compose 设计架构

[root@localhost wwwroot]# tree /root/compose_nginx/
/root/compose_nginx/
├── docker-compose.yml
├── nginx
│   ├── Dockerfile
│   └── nginx-1.12.2.tar.gz
└── wwwroot
    └── index.html

1.61 安装docker-ce

环境以docker为基础,安装docker的步骤参见以下链接:

https://blog.csdn.net/weixin_48192495/article/details/109626644

1.62 下载compose工具

[root@LPH ~]# curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
[root@LPH ~]# chmod +x docker-compose
[root@LPH ~]# mv docker-compose /usr/bin

1.63 创建dockerfile的目录

mkdir compose_nginx
cd compose_nginx/
mkdir nginx  &&  cd nginx/

1.64 在nginx目录中写dockerfile文件

vim Dockerfile

FROM centos:7
MAINTAINER this is a nginx image <liang>
RUN yum -y update
RUN yum -y install gcc gcc-c++ pcre* make cmake zlib-devel openssh* net-tools lsof telnet passwd vim
ADD nginx-1.12.2.tar.gz /usr/local/src
RUN useradd -M -s /sbin/nologin nginx
WORKDIR /usr/local/src/nginx-1.12.2
RUN (./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module)
RUN make && make install
ENV PATH /usr/local/nginx/sbin/:$PATH
#RUN ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
EXPOSE 80
EXPOSE 443
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
#指关闭守护进程启动
CMD ["nginx"]

1.65 配合dockerfile文件中add部分涉及到的文件,添加到目录

上传源码包nginx-1.12.2.tar.gz到nginx 目录

最后nginx目录
[root@localhost nginx]# ls
Dockerfile  nginx-1.12.2.tar.gz 
### 1.66 编写yaml文件
[root@localhost compose_nginx]# vim /root/compose_nginx/docker-compose.yml
version: '3'
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 1216:80
      - 1217:443
    networks:
      - cluster
    volumes:
      - ./wwwroot:/usr/local/nginx/html
networks:
  cluster:                 

1.66 执行程序查看生成的容器

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

[root@localhost compose_nginx]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                                         NAMES
9276e49e14b4        compose_nginx_nginx   "nginx"             12 minutes ago      Up 12 minutes       0.0.0.0:1216->80/tcp, 0.0.0.0:1217->443/tcp   compose_nginx_nginx_1

1.67 制作测试页并测试

[root@localhost compose_nginx]# cat /root/compose_nginx/wwwroot/index.html 
this is peihua.com

真机使用谷歌浏览器:12.0.0.25:1217

在这里插入图片描述

二. docker consul 容器服务发现与更新

consul 属于微服务中的一种

2.1 容器服务更新与发现拓扑图

在这里插入图片描述

  1. 左边ngnix 作为反向代理
  2. consul template 相当于配置文件模板
  3. consul agent:包括consul server 和consul client,相当于监控
  4. registrator 注册机
  5. 右边节点搭建业务容器
    工作原理:
    右边的业务节点的配置文件发生改变,或者增加,减少。例如:当增加一个容器的时候就会
    注册registrator,registrator会通知consul agent需要更新, consul监控到后端增加了一个容器后,便会把新增容器的IP地址和端口等参数以变量的方式传递给consul complate 模板,consul complate 会生成一个新的nginx配置文件,替代原来的配置文件,使新的容器被发现并且更新进集群。

2.2 构建自动发现的Docker服务架构

2.21 构建consul 服务

  • 每个提供服务的节点上都要部署和运行consul的agent
  • consul agent 有两种运行模式
  1. Server
  2. Client
  • Server 和 Client 只是consul 集群层面的区分,与搭建在cluster之上的应用服务无关
[root@localhost ~]# mkdir consul
[root@localhost ~]# cd consul
[root@localhost consul]# unzip consul_0.9.2_linux_amd64.zip 
[root@localhost consul]# mv consul /usr/bin

[root@localhost consul]# 
consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=12.0.0.25 -client=0.0.0.0 -node=consul-server01 &> /var/log/consul.log&

2.22 查看集群信息

[root@localhost consul]# consul members
[root@localhost consul]# consul members
Node             Address         Status  Type    Build  Protocol  DC
consul-server01  12.0.0.25:8301  alive   server  0.9.2  2         dc1

[root@localhost consul]# consul info | grep leader
	leader = true
	leader_addr = 12.0.0.25:8300

//通过http api 获取集群信息

//查看集群server成员
[root@localhost consul]# curl 127.0.0.1:8500/v1/status/peers
["12.0.0.25:8300"]

//查看集群Raf leader
[root@localhost consul]# curl 127.0.0.1:8500/v1/status/leader
"12.0.0.25:8300"

//查看注册的所有服务
[root@localhost consul]# curl 127.0.0.1:8500/v1/catalog/services
{"consul":[]}

 //查看nginx服务的信息
[root@localhost consul]# curl 127.0.0.1:8500/v1/catalog/nginx

//集群节点详细信息
[root@localhost consul]# curl 127.0.0.1:8500/v1/catalog/nodes
[{"ID":"2846b06b-5079-78d3-ec8c-6ae92d5971a1","Node":"consul-server01","Address":"12.0.0.25","Datacenter":"dc1","TaggedAddresses":{"lan":"12.0.0.25","wan":"12.0.0.25"},"Meta":{},"CreateIndex":5,"ModifyIndex":6}]

2.3 实现容器服务自动加入Nginx集群

对于业务端的node节点的操作:

2.31 安装gliderlabs/registrator

  • 检查容器运行状态
  • 自动注册和注销docker容器的服务到服务配置中心

在12.0.0.26节点操作

[root@localhost ~]# 
docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
-ip=12.0.0.26 \
consul://12.0.0.26:8500

查看状态

[root@localhost ~]# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
gliderlabs/registrator   latest              3b59190c6c80        4 years ago         23.8MB

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                NAMES
20641ed62f11        gliderlabs/registrator:latest   "/bin/registrator -i…"   20 minutes ago      Up 20 minutes                            registrator

2.4 验证web容器是否注册到consul

//创建业务容器

[root@localhost ~]# docker run -itd -p 83:80 --name test-01 -h test01 nginx
[root@localhost ~]# docker run -itd -p 84:80 --name test-02 -h test02 nginx
[root@localhost ~]# docker run -itd -p 85:80 --name test-03 -h test03 nginx
[root@localhost ~]# docker run -itd -p 86:80 --name test-04 -h test04 httpd

//查看容器

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                           COMMAND                  CREATED             STATUS              PORTS                NAMES
dd6ffd76bc08        httpd                           "httpd-foreground"       11 minutes ago      Up 11 minutes       0.0.0.0:86->80/tcp   test-04
f4b5145c58a3        nginx                           "/docker-entrypoint.…"   12 minutes ago      Up 12 minutes       0.0.0.0:85->80/tcp   test-03
2ae9b0bb7ef9        nginx                           "/docker-entrypoint.…"   13 minutes ago      Up 13 minutes       0.0.0.0:84->80/tcp   test-02
0b17fef17ceb        nginx                           "/docker-entrypoint.…"   14 minutes ago      Up 14 minutes       0.0.0.0:83->80/tcp   test-01
20641ed62f11        gliderlabs/registrator:latest   "/bin/registrator -i…"   26 minutes ago      Up 26 minutes                            registrator

//真机输入:12.0.0.25:8500
注意:consul server的端口号为8500
在这里插入图片描述
//测试网页是否开启
输入:12.0.0.26:83
在这里插入图片描述

//对应节点位置查看日志
(12.0.0.26)

[root@localhost ~]# docker logs -f test-01

在这里插入图片描述

2.5 使用docker template 自动更新nginx集群

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

2.51 安装consul-template

[root@localhost ~]# unzip consul-template_0.19.3_linux_amd64.zip
[root@localhost ~]# mv consul-template /usr/bin

2.52 准备template nginx 模板文件

结构图:
在这里插入图片描述

备注:
此模板用于nginx反向代理模板
nginx.ctmpl跟nginx没有直接关系
consul是docker的一种自动管理机制
nginx.ctmpl中的参数以变量的形式写入

[root@localhost consul]# vim //root/consul/nginx.ctmpl 

upstream http_backend {
   {{range service "nginx"}}
    server {{.Address}}:{{.Port}};
     {{end}}
}

server {
  listen 87;
  server_name localhost 12.0.0.25;
  access_log /var/log/nginx/lph.com-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;
  }
}

2.53 编译安装nginx (做反向代理)

[root@localhost consul]# yum install gcc gcc-c++ pcre-devel zlib-devel make -y
[root@localhost consul]# ls
nginx-1.12.2.tar.gz  nginx.ctmpl
[root@localhost consul]# tar zxvf nginx-1.12.2.tar.gz -C /opt
[root@localhost consul]# cd /opt/nginx-1.12.2/
[root@localhost nginx-1.12.2]# ./configure --prefix=/usr/local/nginx
[root@localhost nginx-1.12.2]# make && make install

2.54 配置nginx,然后启动

vim /usr/local/nginx/conf/nginx.conf

http {
    include       mime.types;
    include vhost/*.conf;                                //添加虚拟主机目录
    default_type  application/octet-stream;

//检验一下配置文件的语法
[root@localhost nginx-1.12.2]# /usr/local/nginx/sbin/nginx -t

//创建虚拟主机目录

mkdir /usr/local/nginx/conf/vhost

//创建日志文件目录(在template那里定义了这个目录)

mkdir /var/log/nginx

//启动nginx

[root@localhost nginx-1.12.2]#  /usr/local/nginx/sbin/nginx

2.55 准备工作完毕,启动template,指定template模板文件及生成路径

指定模板路径,/root/consul/nginx.ctmpl,生成到/usr/locla/nginx/conf/vhost/lph.conf,然后重载nginx -s reload

[root@localhost nginx-1.12.2]# consul-template -consul-addr 12.0.0.25:8500 \
> -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/lph.conf:/usr/local/nginx/sbin/nginx -s reload" \
> --log-level=info

已进入监控状态

在这里插入图片描述

2.56 打开另一个终端查看生成配置文件

[root@localhost conf]# cd /usr/local/nginx/conf/vhost/
[root@localhost vhost]# ls
lph.conf

[root@localhost vhost]# cat lph.conf 
upstream http_backend {
   
    server 12.0.0.26:83;
     
    server 12.0.0.26:84;
     
    server 12.0.0.26:85;
     
}

server {
  listen 88;
  server_name localhost 12.0.0.25;
  access_log /var/log/nginx/lph.com-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;
  }
}

2.57 在客户端测试并结合nginx后端容器节点logs验证

  • 如果能访问且后端容器节点logs互为轮询说明服务已自动发现及更新配置文件完毕

//在业务节点

[root@localhost ~]# docker logs -f test-01
[root@localhost ~]# docker logs -f test-02 //新开一个终端

三. consul 多节点

//添加一台已有docker环境的服务器12.0.0.22/24 加入已有的群集中

consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=12.0.0.22 \
-client=0.0.0.0
-node=consul-server02 \
-enable-script-checks=true \
-datacenter=dc1 \
-join 12.0.0.25 &> /var/log/condul.log &


-enable-script-checks=true     设置检查服务为可用
-datacenter=dc1                      数据中心名称
-join                                          加入已有的群集中
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值