docker-compose搭建consul

目录

  • 一、概述
  • 二、docker compose容器编排
  • 三、docker compose配置常用字段
  • 四、docker compose常用命令
  • 五、部署
    • 一、compose
      • 一、创建Dockerfile脚本
      • 二、创建模板脚本
      • 三、创建站点文件
      • 四、创建并启动容器
      • 五、测试
    • 二、consul
      • 一、web端
      • 二、容器服务自动加入consul集群
      • 三、测试服务器发现功能是否正常
      • 四、创建consul-template
      • 五、源码编译Nginx
      • 六、配置Nginx
      • 七、配置并启动template

一、概述

compose:
1、Docker Compose的前身是Fig,台是一个定义及运行多个Docker容器的工具。
2、使用Docker Compose不再需要使用Shell脚本来启动容器。
3、Docker Compose非常适合组合使用多个容器进行开发的场景。
consul:
1、Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。
2、Consul的特性

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

二、docker compose容器编排

1、YAML是一种标记语言很直观的数据序列化格式。
2、文件格式及编写注意事项:

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

三、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 容器主机名

四、docker compose常用命令

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

五、部署

192.168.238.100  Docker-ce、compose、consul、consul-template、nginx
192.168.238.99 Docker-ce、registrator

一、compose

[root@localhost ~]# hostnamectl set-hostname web
[root@localhost ~]# su
#安装docker社区版
#上传docker-compose
#compose赋权
[root@web ~]# cp -p docker-compose /usr/local/bin/
[root@web ~]# chmod +x /usr/local/bin/docker-compose

一、创建Dockerfile脚本

[root@web ~]# mkdir /root/compose_nginx
[root@web ~]# cd /root/compose_nginx/
[root@web compose_nginx]# mkdir nginx
[root@web compose_nginx]# cd nginx/
#上传nginx-1.12.2.tar.gz
[root@web nginx]# vim Dockerfile
FROM centos:7
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && yum clean all
ADD nginx-1.12.2.tar.gz /mnt
WORKDIR /mnt/nginx-1.12.2
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --prefix=/usr/local/nginx &> /dev/null
RUN make &> /dev/null
RUN make install &> /dev/null
RUN rm -rf /mnt/nginx-1.12.2
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

二、创建模板脚本

[root@web nginx]# cd ..
[root@web compose_nginx]# vim docker-compose.yml
version: '3'    #与docker版本相关 
services:
  nginx:
    hostname: nginx   #容器主机名  
    build:
      context: ./nginx    #指定构建镜像的路径 
      dockerfile: Dockerfile    #Dockerfile文件 
    ports:  #暴露容器端口
      - 1216:80
      - 1217:443
    networks:  #加入网络
      - cluster
    volumes:  #挂载点
      - ./wwwroot:/usr/local/nginx/html
networks:
  cluster:

三、创建站点文件

[root@web compose_nginx]# mkdir wwwroot
[root@web compose_nginx]# touch wwwroot/index.html
[root@web compose_nginx]# vim wwwroot/index.html
this is web

docker-compose搭建consul_第1张图片

四、创建并启动容器

[root@web compose_nginx]# docker-compose -f docker-compose.yml up -d
#查看容器
[root@web compose_nginx]# docker ps -a
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS          PORTS                                                                            NAMES
7d20f4f602cc   compose_nginx_nginx   "/usr/local/nginx/sb…"   50 seconds ago   Up 49 seconds   0.0.0.0:1216->80/tcp, :::1216->80/tcp, 0.0.0.0:1217->443/tcp, :::1217->443/tcp   compose_nginx_nginx_1
[root@web compose_nginx]# docker-compose ps
        Name                       Command               State                                      Ports                                    
---------------------------------------------------------------------------------------------------------------------------------------------
compose_nginx_nginx_1   /usr/local/nginx/sbin/ngin ...   Up      0.0.0.0:1217->443/tcp,:::1217->443/tcp, 0.0.0.0:1216->80/tcp,:::1216->80/tcp

五、测试

docker-compose搭建consul_第2张图片

二、consul

一、web端

[root@web compose_nginx]# mkdir /root/consul
[root@web compose_nginx]# cd /root/consul/
[root@web consul]# rz
#上传consul_0.9.2_linux_amd64.zip
[root@web consul]# unzip consul_0.9.2_linux_amd64.zip
Archive:  consul_0.9.2_linux_amd64.zip
  inflating: consul 
[root@web consul]# mv consul /usr/bin
[root@web ~]# consul agent \
> -server \ #服务端
> -bootstrap \ #前端框架
> -ui \ #可被访问的web界面
> -data-dir=/var/lib/consul-data \
> -bind=192.168.238.100 \
> -client=0.0.0.0 \
> -node=consul-server01 &> /var/log/consul.log &
[1] 56236
[root@web consul]# jobs
[1]+  运行中               consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.238.100 -client=0.0.0.0 -node=consul-server01 &>/var/log/consul.log &
[root@web consul]# consul members #查看集群信息
Node             Address               Status  Type    Build  Protocol  DC
consul-server01  192.168.238.100:8301  alive   server  0.9.2  2         dc1
[root@web consul]# consul info | grep leader
	leader = true
	leader_addr = 192.168.238.100:8300
##通过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@consul consul]# curl 127.0.0.1:8500/v1/catalog/nodes  #集群节点详细信息
[{"ID":"cda531ef-9e6a-1e0d-54ca-3d540f87d2a4","Node":"consul-server01","Address":"192.168.238.100","Datacenter":"dc1","TaggedAddresses":{"lan":"192.168.238.100","wan":"192.168.238.100"},"Meta":{},"CreateIndex":4,"ModifyIndex":4}]

二、容器服务自动加入consul集群

#server端
[root@localhost ~]# hostnamectl set-hostname server
[root@localhost ~]# su
#安装docker社区版
[root@server ~]# docker run -d \
> --name=registrator \
> --net=host \
> -v /var/run/docker.sock:/tmp/docker.sock \
> --restart=always \
> gliderlabs/registrator:latest \
> -ip=192.168.238.99 \
> consul://192.168.238.100:8500

docker-compose搭建consul_第3张图片
在这里插入图片描述

三、测试服务器发现功能是否正常

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

在这里插入图片描述
访问:192.168.238.100:8500
docker-compose搭建consul_第4张图片

#在web端查看服务
[root@web consul]# curl 127.0.0.1:8500/v1/catalog/services
{"consul":[],"httpd":[],"nginx":[]}

四、创建consul-template

[root@web consul]# vim /root/consul/nginx.ctmpl #创建template Nginx模板文件

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

server {
  listen 83;    #ngixn的监听端口
  server_name localhost 192.168.35.40;  #反向代理的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;
  }
}

五、源码编译Nginx

[root@web ~]# cd /opt
#上传nginx-1.12.2.tar.gz
[root@web opt]# yum install gcc pcre-devel zlib-devel -y #安装依赖环境
[root@web opt]# tar zxvf nginx-1.12.2.tar.gz #解包、
[root@web opt]# cd nginx-1.12.2
[root@web nginx-1.12.2]# ./configure --prefix=/usr/local/nginx #源码编译
[root@web nginx-1.12.2]# make && make install

六、配置Nginx

[root@web nginx-1.12.2]# vim /usr/local/nginx/conf/nginx.conf
第19行include  vhost/*.conf; #添加虚拟主机目录为了让那个识别vhost/*.conf的文件(consul动态生成的配置文件就会放在这里)

docker-compose搭建consul_第5张图片

[root@web nginx-1.12.2]# mkdir /usr/local/nginx/conf/vhost #创建虚拟主机目录
[root@web nginx-1.12.2]# mkdir /var/log/nginx #创建日志目录
[root@web nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/sbin
[root@web nginx-1.12.2]# nginx
[root@web nginx-1.12.2]# netstat -antp | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      60003/nginx: master

七、配置并启动template

[root@web nginx-1.12.2]# cd 
[root@web ~]# rz
#上传consul-template_0.19.3_linux_amd64.zip
[root@web ~]# unzip consul-template_0.19.3_linux_amd64.zip
[root@web ~]# mv consul-template /usr/bin/

#关联nginx虚拟目录中的子配置文件
[root@web ~]# consul-template -consul-addr 192.168.238.100:8500 \
> -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/ghs.conf:/usr/local/nginx/sbin/nginx -s reload" \
> --log-level=info
#查看生成的配置文件
[root@web ~]#  cat /usr/local/nginx/conf/vhost/ghs.conf
upstream http_backend {
  
   server 192.168.238.99:83;	
   
   server 192.168.238.99:84;	
   
}

server {
  listen 83;	#ngixn的监听端口
  server_name localhost 192.168.35.40;	
  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;
  }
}

八、在server测试增删Nginx容器节点

#增加
[root@server ~]# docker run -itd -p:86:80 --name test-06 -h test06 nginx

docker-compose搭建consul_第6张图片
在这里插入图片描述

#删除
[root@server ~]# docker rm -f fb84da54c6d6

docker-compose搭建consul_第7张图片

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