实验:
1)整理docker实现服务发现的过程,及设计到的组件和组件的租用
服务发现流程html
Docker 》 registrator 》 consul 》 consul-template 》 nginx
总结:
Consul :分布式,高可用,服务发现和配置服务的工具。数据中心。
Registrator:负责收集dockerhost上,容器服务的信息,而且发送给consul。
Consul-template:根据编辑好的模板。生产新的nginx配置文件,并负责从新加载nginx配置文件。node
2)服务发现为:nginx的container服务。主界面内容作区分:要包含本身的名称。
录像2遍,文档一遍。
服务发现linux
关闭各个虚拟机防火墙,禁用selinux(以后最好重启一下docker服务)
[root@docker ~]# systemctl stop firewalld.service
[root@docker ~]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.nginx
[root@docker ~]# setenforce 0
[root@docker ~]# systemctl restart docker
Docker + Consul + registrator实现服务发现
实验环境:consul:多数据中心
Docker01 docker02 docker03
192.168.1.1 1.20 1.30web
导入包consul_1.5.1_linux_amd64.zip
网址:https://www.consul.io/downloads.html
解压
1》docker01,启动consul服务
[root@docker ~]# unzip consul_1.5.1_linux_amd64.zip
Archive: consul_1.5.1_linux_amd64.zip
inflating: consul docker
[root@docker ~]# mv consul /usr/local/bin/
[root@docker ~]# chmod +x /usr/local/bin/consul
[root@docker ~]# consul -hbootstrap
改时间
consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.1.1 -client=0.0.0.0 -node=master
后台运行
[root@docker ~]# nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.1.1 -client=0.0.0.0 -node=master &
nohup: 忽略输入并把输出追加到"nohup.out"vim
Ps://-bootstrap:加入这个选项时,通常都在server单节点的时候用,自选举为leader。 -ui :开启内部的web页面。 -data-dir: key/volum 数据存储位置。(数据的存储目录在那) -bind:指定开启服务的IP -client:指定访问的客户端 -node:指定集群内通讯使用的名称。(若是不写的话默认是主机名) PS:开启的端口 8300:集群节点 8301:集群内部的访问 8302:跨数据中心的通讯 8500:web ui界面 8600:使用dns协议查看节点信息的端口。
//查看consul的信息
[root@docker ~]# consul info后端
consul:
leader_addr = 192.168.1.1:8300浏览器
//查看consul集群内成员的信息
[root@docker ~]# consul members
2》docker02,docker03加入consul集群
这里咱们采用容器的方式去运行consul服务。
Docker02
docker run -d --name consul -p 8301:8301 -p 8301:8301/udp -p 8500:8500 -p 8600:8600 -p 8600:8600/udp --restart always progrium/consul:latest -join 192.168.1.1 -advertise 192.168.1.20 -client 0.0.0.0 -node=node01
Docker03
docker run -d --name consul -p 8301:8301 -p 8301:8301/udp -p 8500:8500 -p 8600:8600 -p 8600:8600/udp --restart always progrium/consul:latest -join 192.168.1.1 -advertise 192.168.1.30 -client 0.0.0.0 -node=node02
tcp:udp的区别: 一、TCP与UDP区别总结: 一、TCP面向链接(如打电话要先拨号创建链接);UDP是无链接的,即发送数据以前不须要创建链接 二、TCP提供可靠的服务。也就是说,经过TCP链接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付 Tcp经过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还能够对次序乱掉的分包进行顺序控制。 三、UDP具备较好的实时性,工做效率比TCP高,适用于对高速传输和实时性有较高的通讯或广播通讯。 4.每一条TCP链接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通讯 五、TCP对系统资源要求较多,UDP对系统资源要求较少。
浏览器访问consul服务,,验证集群信息。
3》下载部署consul-template
导入包consul-template_0.19.5_linux_amd64.zip命令 [root@docker ~]# unzip consul-template_0.19.5_linux_amd64.zip Archive: consul-template_0.19.5_linux_amd64.zip inflating: consul-template [root@docker ~]# mv consul-template /usr/local/bin/ [root@docker ~]# chmod +x /usr/local/bin/consul-template
4》docker02,docker03上部署registrator服务。
Registrator是一个能自动发现docker container提供的服务,并在后端服务注册中心注册服务或取消服务的工具,后端注册中心支持conusl,etcd,skydns2,zookeeper等
导入镜像包myregistrator.tar
[root@docker2 ~]# docker load < myregistrator.tar
[root@docker2 ~]# docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart always gliderlabs/registrator consul://192.168.1.20:8500
[root@docker3 ~]# docker load < myregistrator.tar
[root@docker3 ~]# docker run -dd --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart always gliderlabs/registrator consul://192.168.1.30:8500
建立一个nginx服务容器
[root@docker2 ~]# docker run -d -P --name test nginx
验证conusl上的nginx服务
[root@docker3 桌面]# docker run -d -P --name test nginx
e7c2453916b3e40bbc73db25913633d9793952f27dc4b51d5a7fe44157c4c55c
5》docker01部署一个nginx服务。****
**//依赖环境** [root@docker ~]# yum -y install openssl-devel zlib-devel pcre-devel 导入软件包nginx-1.14.0.tar.gz [root@docker ~]# useradd -M -s /sbin/nologin nginx [root@docker ~]# tar -zxf nginx-1.14.0.tar.gz [root@docker ~]# cd nginx-1.14.0/ **编译** [root@docker nginx-1.14.0]# ./configure --user=nginx --group=nginx --with-http_stub_status_module --with-http_realip_module --with-pcre --with-http_ssl_module 安装 [root@docker nginx-1.14.0]# make && make install **建立软链接** [root@docker nginx-1.14.0]# ln -s /usr/local/nginx/sbin/* /usr/local/bin/ 验证nginx运行正确 [root@docker nginx-1.14.0]# nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful 启动nginx [root@docker nginx-1.14.0]# nginx
PS:这里nginx做为反向带理,代理后端docker02,docker03上nginx的容器服务,因此咱们先去docker02,docker03上部署一些服务,为了方便等会看到负载的效果,因此,咱们运行完成容器以后,作一个主界面内容的区分;
Docker02: web1 web2
Docker3: web3 web4
[root@docker2 ~]# docker run -itd --name web1 -P nginx:latest
[root@docker2 ~]# docker exec -it web1 /bin/bash
root@5a16c990042d:~# cd /usr/share/nginx/html/
root@5a16c990042d:/usr/share/nginx/html# echo The web container in docker02-web01 > index.html
Docker01上更改nginx的配置文件。
[root@docker nginx]# mkdir consul
[root@docker nginx]# cd consul/
/usr/local/nginx/consul
[root@docker consul]# vim nginx.ctmpl upstream http_backend { {{range service "nginx"}} server {{ .Address }}:{{ .Port }}; {{ end }} } server { listen 8000; server_name localhost; location / { proxy_pass http://http_backend; } }
[root@docker conf]# vim nginx.conf
配置文件最后添加
include /usr/local/nginx/consul/*.conf;
在本主机,经过template,因建立了usr/local/nginx/consul/nginx.ctmpl配置文件,
根据[root@docker conf]# consul-template -consul-addr 192.168.1.1:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/bin/nginx -s reload"
后台运行
[root@docker conf]# nohup consul-template -consul-addr 192.168.1.1:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/bin/nginx -s reload" & nohup: 忽略输入并把输出追加到"nohup.out"
查看目录
[root@docker consul]# pwd
/usr/local/nginx/consul
[root@docker consul]# ls
nginx.ctmpl vhost.conf
重启nginx
nginx -s reload
查看8000端口是否起来
ss -lnt
固然:这时无论后端是新添加nginx的web容器,或是删除,新生产的配置文件都会实时的更新,这是咱们在运行consul-template这条命令添加的模板把。
流程的运行:docker1上先启动consul服务,部署一个consul集群,docker1则为集群的server→docker2,docker3加入consul集群,使用容器的方式去运行consul服务,都为client端→在docker1上部署consul-template→在docker2,docker3上部署registrator服务将容器服务的信息发送给consul(docker1)→docker1上部署nginx服务而且须要作负载均衡与反向代理,因此先在docker2,docker3各自运行两个nginx的验证容器,以便后来验证→写入一个consul-template的模板文件,以此文件来生成一个nginx的配置文件,生成的配置文件中记录了docker2和docker3容器的服务信息