配置环境:
服务器:20.0.0.21 Docker-ce、Compose 3、Consul(自动发现自动更新)、Consul-template
服务器:20.0.0.20 Docker-ce、registrator(自动发现)
服务器:20.0.0.22 Consul
以下操作在20.0.0.21服务器操作
- docker compose部署
把docker-compose容器编排工具上传上去
cp -p docker-compose /usr/local/bin/ //把工具复制到bin下,让系统所能识别
chmod +x /usr/local/bin/docker-compose //给执行权限
mkdir compose_nginx //创建一个nginx编排容器目录,意思就是各种版本nginx镜像都可以放这个目录下
cd compose_nginx/ //进入目录
- 以下部分和nginx镜像创建一样
mkdir nginx //创建一个nginx目录
cd nginx/ //进入nginx
vim Dockerfile //编辑一个Dockerfile容器脚本
#基于基础镜像
FROM centos:7
#用户信息
MAINTAINER this is nginx <zk>
#添加环境包
RUN yum -y update
RUN yum -y install gcc gcc-c++ make pcre-devel zlib-devel perl
RUN useradd -M -s /sbin/nologin nginx
#下载nginx软件包
ADD nginx-1.15.9.tar.gz /opt
WORKDIR /opt
#指定工作目录
WORKDIR nginx-1.15.9
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
#指定http和https端口,和关闭守护进程,因为由容器支撑
EXPOSE 80
EXPOSE 443
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf
#添加宿主机中run.sh到容器中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
把nginx包上传上去
- 上面就是nginx镜像创建
cd ..
vim docker-compose.yml //创建compose编排模板脚本
version: '3'
services:
nginx:
hostname: nginx
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- 1216:80
- 1217:443
networks:
- zjz
volumes:
- ./wwwroot:/usr/local/nginx/html
networks:
zjz:
---------------------------------------------------------上面脚本的解释------------------------------------------------------------------------------
version: '3' //编排工具版本
services: //服务。下面首行缩进的都代表都是services子选项
nginx: //服务名称
hostname: nginx //容器主机名
build: //重新构建服务
context: ./nginx //创建nginx所需的材料都在当前nginx目录下
dockerfile: Dockerfile //指定dockerfile文件在当前nginx目录下
ports: //提供出来的端口
- 1216:80 //1216是对外端口,80是内端口,http的
- 1217:443 //1217是对外端口,443是内端口,https的
networks: //网络名称
- zjz //如果要建群集,那这就是网络群集名称。如果想让别的容器跟你一个网段,那这里名称要一致
volumes: //建立一个数据卷
- ./wwwroot:/usr/local/nginx/html //把宿主机的wwwroot目录关联到容器上的站点目录,会在宿主机自动创建wwwroot目录
networks: //对外公开声明一下networks群集的名称。针对整个服务器的。跟services一个级别,不用缩进。
zjz:
--------------------------------------------------------------------------------------------------------------------------------------------------------
//-f:执行docker-compose.yml工具的编排,up:开启 意思是创建容器后就开启,-d:守护进程
docker-compose -f docker-compose.yml up -d
测试:http://20.0.0.21:1216/ //会显示403,也就是能连接上但没有网页
//创建一个站点页面
echo "this is nginx" > wwwroot/index.html
测试:http://20.0.0.21:1216/ //在查看就是正常访问了
以下操作在20.0.0.21服务器操作
- consul服务器部署
mkdir consul
cd consul/
把consul_0.9.2_linux_amd64包上传到此目录
unzip consul_0.9.2_linux_amd64.zip //解压
mv consul /usr/bin/ //让系统所能识别命令
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=20.0.0.21 \
-client=0.0.0.0 \
-node=consul-server01 & > /var/log/consul.log &
-----------------------------------------上面的配置解释------------------------------------------------------
consul agentr \ //使用agentr代理功能
-server \ //指定服务器server
-bootstrap \ //参与选举为领袖
-ui \ //提供web访问页面(图形化页面)
-data-dir=/var/lib/consul-data \ //数据存储位置
-bind=20.0.0.21 \ //绑定地址(本地地址)
-client=0.0.0.0 \ //监听客户端任意网段
-node=consul-server01 & > /var/log/consul.log & //node=consul-server01 是本地节点名称,不管对的错的 有日志产生就混合输出到/var/log/consul.log下,& 放到后台运行
---------------------------------------------------------------------------------------------------------------
//查看集群信息
[root@localhost consul]# consul members
Node Address Status Type Build Protocol DC
consul-server01 20.0.0.21:8301 alive(在线状态) server 0.9.2 2 dc1(数据中心,默认都叫dc1)
[root@localhost consul]# consul info | grep leader //过滤leader(老大,也是服务角色)是谁
leader = true
leader_addr = 20.0.0.21: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/services //查看nginx服务信息
curl 127.0.0.1:8500/v1/catalog/nodes //集群节点详细信息------做到这里,只能这条能查询使用!
以下操作在20.0.0.20服务器操作!!!!
- 容器服务自动加入nginx集群(Registrator注册器)
1.安装Glider labs/Registrator Glider labs/Registrator
可检查容器运行状态自动注册,还可注销docker容器的服务到服务配置中心。
目前支持 Consul、Etcd 和 SkyDNS2。
在 20.0.0.20 节点,执行以下操作:
docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
-ip=20.0.0.20 \
consul://20.0.0.21:8500
----------------------------上面解释--------------------------------------------------
docker run -d \
--name=registrator \ //指定容器名称
--net=host \ //指定host网络
-v /var/run/docker.sock:/tmp/docker.sock \ //指定数据卷
--restart=always \ //重启策略(always:始终重启)
gliderlabs/registrator:latest \ //指定从哪个镜像进行加载
-ip=20.0.0.20 \ //指定本地ip地址
consul://20.0.0.21:8500 //指定对方ip地址
---------------------------------------------------------------------------------------
等上面下载完成后,就可以实现自动注册功能
浏览器输入20.0.0.21:8500就能看见consul页面情况,但里面没有服务,只有自己
2、测试服务发现功能是否正常,还是在20.0.0.21服务器操作
下面创建容器解释:用docker run -itd ,指定外端口83映射到内端口80,容器名称test-01,-h test01是主机名删掉也可以,nginx镜像
可以一个一个创建,也可以直接复制四条进去创建,但创建后要ps -a查看一下少不少,少哪个容器在单独创建哪个
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
2、验证http 和nginx 服务是否注册到 consul
浏览器输入 20.0.0.21:8500 ,单机 NODES ,然后单机 consurl-server01,会出现5个服务
3、验证nginx能不能正常访问
浏览器输入20.0.0.20:83 就能看见nginx网页
浏览器输入20.0.0.20:84 就能看见nginx网页
20.0.0.20服务器就自动注册
20.0.0.21服务器就会自动发现
还是在20.0.0.21服务器上操作
- 部署compose template
Consul-Template是一个守护进程,用于实时查询Consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。更新完成以后,
可以选择运行shell命令执行更新操作,重新加载Nginx。Consul-Template可以查询Consul中的服务目录、Key、Key-values等。
这种强大的抽象功能和查询语言模板可以使Consul-Template 特别适合动态的创建配置文件。
例如:创建Apache/Nginx Proxy Balancers、Haproxy Backends
准备template nginx模板文件
这个模板的作用实现配置文件的实时更新
//在consul(20.0.0.21)上操作
mkdir consul/
cd consul/
vim nginx.ctmpl
vim /root/consul/nginx.ctmpl
#http_backend(是服务器池子的名称)
upstream http_backend {
{{range service "nginx"}}
server {{.Address}}:{{.Port}};
{{end}}
}
upstream模块,将使nginx跨越单机的限制,完成网络数据的接收、处理和转发。
上面代码的解释:upstream模块做的是四层转发。这个模板当中先声明了后端服务器池(也就是上面五行代码),这个后端服务器池引用了两个变量,一个是Address、一个是Port,分别读取node节点20.0.0.20ip地址和20.0.0.20的端口83、84,两个信息就会被加载过来,生成两条server条目(开几条nginx就会加载几条)
server {
listen 1216;
server_name localhost 20.0.0.21;
access_log /var/log/nginx/zk.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 {
listen 1216; //监听端口,也是代理端口,提供给客户端的。映射的是容器的外端口
server_name localhost 20.0.0.21; //指定本地地址,监听地址
access_log /var/ log/nginx/zk.cn-access.log; //日志文件所在位置
index index.html index.php; //首页类型
location / {
proxy _set_header HOST $host; //proxy(代理、跳转),header(头部信息),主机
proxy_set_header X-Real-IP $remote_addr; //请求者的地址,会把请求的地址进行转发
proxy_set_header Client-IP $remote_addr; //客户端ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; //跳转的地址
proxy _pass http://http_backend; //proxy _pass是反向代理模块,http协议开头,后面是http_backend(服务器池子名称)地址
}
}
- 编译安装nginx
1、安装环境依赖包
yum -y install gcc gcc-c++ make pcre-devel zlib-devel perl
gcc编译器
gcc-c++编译器
make工具
pcre-devel支持正则表达式的工具
zlib-devel压缩工具
perl语言工具
把nginx包上传上来
tar zxvf nginx-1.15.9.tar.gz -C /opt/ //解压
cd /opt/nginx-1.15.9/
./configure --prefix=/usr/local/nginx //指定安装目录
make && make install //编译安装
vim /usr/local/nginx/conf/nginx.conf //nginx主配置文件
写在http字段当中添加
include vhost/*.conf; //只要是vhost目录下带有.conf结尾的都能识别
cd /usr/local/nginx/conf/
mkdir vhost //上面主配置指定了路径,在这创建一个vhost
mkdir /var/log/nginx //生成的日志路径。刚刚配置里的路径,需要手动创一个nginx目录
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ //让系统所能识别nginx命令
nginx //启动nginx
[root@localhost log]# netstat -anpt | grep nginx //查看nginx启动了没
- 配置并启动 template
cd //cd到root家目录
unzip consul-template_0.19.3_linux_amd64.zip //解压
mv consul-template /usr/bin/ //系统所能识别
//启用模板
consul-template -consul-addr 20.0.0.21:8500 \
-template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/zk.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info
-------------------------------------上面解释-------------------------------------------
consul-template -consul-addr 20.0.0.21:8500 \ //指定本地ip地址。读取template模板,加载本地的consul的服务当中拉取我所需的东西
-template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/zk.conf:/usr/local/nginx/sbin/nginx -s reload" \ // 通过template模板产生出zk.conf配置文件,重载配置文件
--log-level=info //日志定义 info(信息)级别
----------------------------------------------------------------------------------------
这个时候就会进入监控状态,需要另开终端!
//另外打开一个终端查看生成配置文件
cd /usr/local/nginx/conf/vhost/ //里面会自动生成一个zk.conf配置文件,可以vim进去看看
docker ps -a //查看一下容器
docker stop d4cd7c9816e2 //把刚刚那个容器关闭掉。冲突了!
/usr/local/nginx/sbin/nginx -s reload //重启一下服务
浏览器输入:20.0.0.21:1216 就可以看见nginx网站
- 增加一个nginx容器节点,看看zk.conf配置文件会不会变更
增加一个 nginx 容器节点,测试服务发现及配置更新功能
//在registrator服务端注册(20.0.0.20服务器上)
docker run -itd -p:85:80 --name test-05 -h test05 nginx //创建一个容器
这个时候20.0.0.21服务器就会监控自动更新了,更新的是zk.conf
去20.0.0.21里面vim zk.conf 就能看见更新了ip
//查看三台nginx容器日志,请求正常轮询到各个容器节点上(20.0.0.20服务器查看)
docker logs -f test-01 //就能看见谁访问的我!
docker logs -f test-02
docker logs -f test-05
以下操作在20.0.0.22服务器操作
- consul多节点
//添加一台已有docker环境的服务器20.0.0.22/24加入已有的群集中
把consul_0.9.2_linux_amd64包传上去
unzip consul_0.9.2_linux_amd64.zip
mv consul /usr/bin/ //系统所能识别命令
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=20.0.0.22 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true \
-datacenter=dc1 \
-join 20.0.0.21 &> /var/log/consul.log &
------------------------------上面解释------------------------------------------
consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=20.0.0.22 \
-client=0.0.0.0 \
-node=consul-server02 \ //节点名称server02
-enable-script-checks=true \ //开启服务检查
-datacenter=dc1 \ //数据中心名称
-join 20.0.0.21 &> /var/log/consul.log & //添加到已有的集群当中
-------------------------------------------------------------------------------------------------------------
-enable-script-checks=true:设置检查服务为可用
-datacenter:数据中心名称
-join:加入到已有的集群中
测试:浏览器输入http://20.0.0.21:8500/,NODES里面就有server02