docker最核心的是容器,容器中有相应的业务环境,容器中跑的业务,那么怎么实现容器的创建和删除,业务还能够不收影响的提供服务
如果创建新的容器,怎么样快速发现业务并且提供服务?
这里就讲一下服务注册
什么是服务注册中心?
服务注册中心本质上是为了了解解耦服务提供者和服务消费者,对于任何一个微服务,原则上都存在多个支持者,所以为了支持弹性伸缩的特性,微服务的提供数量和分布往往是不同变换的,所以需要引用额外的组件来管理微服务提供者的注册和发现。而这个组件就是服务注册中心。
服务注册中心的软件
- Zookeeper
主要的应用在大数据领域,是一种分布式,开放源码的分布式应用程序协调服务,是Hadoop和Hbase的重要组件,他是一个分布式应用提供的一致性的服务软件。
- Eureka
是基于REST服务,主要是AWS云服务为支持,提供服务发现并实现负载均衡和故障转移
- Etcd
是基于一个分布式键值对存储系统,用于可靠,快速的保存关键的数据,并提供访问,通过分布式锁,leader选举和写屏障
- Consul
是HashiCorp公司推出的开源工具,用来实现分布式系统的服务发现和配置,安装包是一个可执行的文件,方面部署
Consul 主要功能
- 1, 服务发现
通过DNS和HTTP接口使得消费者发现服务,应用程序可以轻松找到所依赖的服务
- 2, 健康检查
防止将请求转发到不健康的主机上
- 3, 键值存储
可以使用分层键/值进行存储
Consul agent 是Consul的核心组件,分为客户端和服务端两种模式
- 默认以客户端模式运行,提供服务注册,健康检查,转发查询等
- server模式去启动时使用-server的选项指定,用于维护Consul集群状态,Raft协议进行选举。
- Agent 必须在每个Consul节点运行,所以运行的Consul agent节点构成Consul集群。
- 建议Consul集群至少有3或者5个节点运行Consul agent server模式,client节点不限
- 通过join和rejoin选项加入集群,一旦加入,集群信息总使用gossip算法同步到整个集群节点
自动发现自动注册的方案
- Docker+Etcd+Confd+Nginx
- Docker+Consul+Nginx
注册器(registrator):根据服务运行状态,注册/注销服务。主要要解决的问题是,何时发起注册/注销动作。
注册表(registry):存储服务信息。常见的解决方案有zookeeper、etcd、cousul等。
发现机制(discovery):从注册表读取服务信息,给用户封装访问接口。
项目部署(Docker+Consul+Nginx)
使用Docker 将Consul,Consul Template,Registrator 和nginx结合成一个可拓展的服务架构,此架构可以添加和移除服务,具体部署如下
- 当容器启动后registrator就会进行注册
- registrator会将注册信息传送给consul agent client
- consul agent client将文件直接传送给leader
- leader会将新的信息更新到consul template上
- consul template会将数据写入到nginx.conf中
- nginx会根据nginx.xonf文件给web提供数据
服务搭建
服务器 |
IP地址 |
软件 |
操作系统 |
Consul |
192.168.2.224 |
Nginx consul conul-temliate |
Centos7 |
Docker01 |
192.168.2.222 |
Docker-ce registrator |
Centos7 |
Docker02 |
192.168.2.223 |
Docker-ce registrator |
Centos7 |
1.部署consul
- 解压consul包
-
[root@consul ~]# unzip consul_0.9.2_linux_amd64.zip Archive: consul_0.9.2_linux_amd64.zip inflating: consul [root@consul ~]# mv consul /usr/bin/
- 指定leader的consul,并且指定相应的数据参数
-
[root@consul ~]# nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.2.224 -client=0.0.0.0 -node=consul-server01 &> /var/log/consul.log & [1] 2602
- 命令解释
- consul agent -server -bootstrap :本身设置成为leader,一个的话指定一下,多个就不需要了
- nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。
- -ui:指定开启UI界面显示
- -data-dir=/var/lib/consul-data 数据放在的路径
- -bind=192.168.2.224 监听的IP
- -client=0.0.0.0 绑定在哪个client地址
- -node=consul-server01 节点在集群中的名字,在集群中节点是唯一的,默认是该节点的主机名
- 查看是否运行中
-
[root@consul ~]# jobs [1]+ 运行中 nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.2.224 -client=0.0.0.0 -node=consul-server01 &>/var/log/consul.log &
- 查看consul集群成员的信息(因为只部署了一个consul,所以现在只能可查看到一个)
-
[root@consul ~]# consul members Node Address Status Type Build Protocol DC consul-server01 192.168.2.224:8301 alive server 0.9.2 2 dc1
- 查看consul集群中的leader
-
[root@consul ~]# consul info |grep leader leader = true leader_addr = 192.168.2.224:8300
- 查看consul所管理的服务
-
[root@consul ~]# consul catalog services Consul 一共五个端口 8300 replication leader farwarding的端口相互复制的端口 8301 lan cossip的端口 8302 wan gossip的端口 8500 web ui界面的端口 8600 使用dns协议查看节点信息的端口
- 下载镜像
-
[root@docker01 docker]# docker pull gliderlabs/registrator:latest latest: Pulling from gliderlabs/registrator Image docker.io/gliderlabs/registrator:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/ c87f684ee1c2: Pull complete a0559c0b3676: Pull complete a28552c49839: Pull complete Digest: sha256:6e708681dd52e28f4f39d048ac75376c9a762c44b3d75b2824173f8364e52c10 Status: Downloaded newer image for gliderlabs/registrator:latest docker.io/gliderlabs/registrator:latest
2.部署registrator容器服务
- 运行registrator容器
-
[root@docker01 docker]# docker run -d --name=registrator --net=host -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator:latest -ip=192.168.2.222 consul://192.168.2.224:8500
[root@docker02 docker]# docker run -d --name=registrator --net=host -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator:latest -ip=192.168.2.223 consul://192.168.2.224:8500
- 测试服务发现功能是正常
-
宿主机访问http://192.168.2.224:8500/ui/#/dc1/services
- 编写web脚本,要进行测试
-
[root@docker01 docker]# vim /web/index.jsp <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>登录</title> </head> <body> <form action="LoginServlet" method="post"> <table> <tr> <td>账号</td> <td><input type="text" name="username"></td> </tr> <tr> <td>密码</td> <td><input type="password" name="password"></td> </tr> <tr> <td><input type="submit" value="登录"></td> </tr> </table> </form> </body>
-
开启两台容器进行测试
-
[root@docker01 docker]# docker run -itd -p:8002:8080 -v /web:/usr/local/tomcat/webapps/ROOT --name docker01-t2 -h docker01-t2 tomcat b51abc4d730170b906bc033c69bd2fa3eb44369fcabd41ea6c90eb55f116b02f [root@docker01 docker]# docker run -itd -p:8001:8080 -v /web:/usr/local/tomcat/webapps/ROOT --name docker01-t1 -h docker01-t1 tomcat 7314559a133f23d5eebd08846922964ea5d9eeccd5cf3281c7bcfc5ff6061b0e
- 测试成功
- 增加两台tomcat,表示测试成功
- 再次不同端口增加两台tomcat容器
-
[root@docker02 docker]# docker run -itd -p:8001:8080 -v /web:/usr/local/tomcat/webapps/ROOT --name docker01-t1 -h docker01-t1 tomcat Unable to find image 'tomcat:latest' locally latest: Pulling from library/tomcat 6c33745f49b4: Pull complete c87cd3c61e27: Pull complete 05a3c799ec37: Pull complete a61c38f966ac: Pull complete 396b39798a69: Pull complete 576b6480761a: Pull complete 0d66e5d46fdf: Pull complete c9a19e25684c: Pull complete 511576b95265: Pull complete 7cbc3d736630: Pull complete Digest: sha256:f728ca177fee0851aea29499fbb2013737231a00264f517cc3d185f6f8bf09a8 Status: Downloaded newer image for tomcat:latest 4f73eefca98e2e5eee55463e3a298e1d20529b08be2fb25971bcdaa657484af6 [root@docker02 docker]# docker run -itd -p:8002:8080 -v /web:/usr/local/tomcat/webapps/ROOT --name docker01-t2 -h docker01-t2 tomcat ef8b5c1174cb45441a9ce68b124688c07ba228456fac8bef54a551bf2701fdac [root@docker02 docker]#
- 进行测试
3. 安装consul-template
-
[root@consul ~]# mkdir consul [root@consul ~]# cd consul [root@consul consul]# vim /root/consul/nginx.tmp [root@consul consul]# cat /root/consul/nginx.tmp uptream http_backend { {{range service "tomcat"}} server {{ .Address }}:{{ .Port }}; {{ end }} } server { listen 8080; server_name localhost 192.168.2.224; access_log /usr/local/nginx/logs/crushlinux-access.log; index index.html index.jsp 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.安装NGINX
-
[root@consul consul]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel openssl-devel [root@consul ~]# tar xf nginx-1.12.1.tar_(1).gz -C /usr/src/ [root@consul nginx-1.12.1]# cd /usr/src/nginx-1.12.1/ [root@consul nginx-1.12.1]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_realip_module --with-pcre --with-http_ssl_module && make -j 2 && make install
- 修改配置文件
-
将下列加入配置文件: [root@consul nginx-1.12.1]# vim /usr/local/nginx/conf/nginx.conf include vhost/*.conf;
-
创建目录,重新启动NGINX
-
[root@consul ~]# mkdir /usr/local/nginx/conf/vhost/ [root@consul ~]# /usr/local/nginx/sbin/nginx
5.测试:
- 目前目录下无东西,基于consul模板生成子文件
-
[root@consul ~]# ls /usr/local/nginx/conf/vhost/ [root@consul ~]# ls consul nginx.tmp
- 配置并启用consul-template
-
[root@consul ~]# unzip consul-template_0.19.3_linux_amd64_(1).zip Archive: consul-template_0.19.3_linux_amd64_(1).zip inflating: consul-template [root@consul ~]# ls anaconda-ks.cfg downloads.html CentOS-7-x86_64-DVD-1810.zip index.html centos-7-x86_64.tar.gz mnt consul mysql consul_0.9.2_linux_amd64.zip nginx-1.12.1 consul-template nginx-1.12.1.tar_(1).gz consul-template_0.19.3_linux_amd64_(1).zip stress [root@consul ~]# mv consul-template /usr/bin/ [root@consul ~]# consul-template -consul-addr 192.168.2.224:8500 -template "/root/consul/nginx.tmp:/usr/local/nginx/conf/vhost/Carrie.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info
- 查看子文件,已经出现了相应内容
-
[root@consul ~]# ls /usr/local/nginx/conf/vhost/ Carrie.conf [root@consul ~]# cat /usr/local/nginx/conf/vhost/Carrie.conf uptream http_backend { server 192.168.2.222:8001; server 192.168.2.222:8002; server 192.168.2.223:8001; server 192.168.2.223:8002; } server { listen 8080; server_name localhost 192.168.2.224; access_log /usr/local/nginx/logs/crushlinux-access.log; index index.html index.jsp 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; } }
至此部署成功。