实验:
1)整理docker实现服务发现的过程,及设计到的组件和组件的租用
服务发现流程

Docker 》 registrator 》 consul 》 consul-template 》 nginx
总结:
Consul :分布式,高可用,服务发现和配置服务的工具。数据中心。
Registrator:负责收集dockerhost上,容器服务的信息,并且发送给consul。
Consul-template:根据编辑好的模板。生产新的nginx配置文件,并负责重新加载nginx配置文件。

2)服务发现为:nginx的container服务。主界面内容做区分:要包含自己的名称。
录像2遍,文档一遍。
服务发现

关闭各个虚拟机防火墙,禁用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.

[root@docker ~]# setenforce 0
[root@docker ~]# systemctl restart docker
Docker + Consul + registrator实现服务发现
实验环境:consul:多数据中心
Docker01 docker02 docker03
192.168.1.1 1.20 1.30

导入包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

[root@docker ~]# mv consul /usr/local/bin/
[root@docker ~]# chmod +x /usr/local/bin/consul
[root@docker ~]# consul -h

改时间
docker服务发现实时监控docker服务发现实时监控
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"

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
docker服务发现实时监控

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的区别:
1、TCP与UDP区别总结:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付

Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。

3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。

4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

5、TCP对系统资源要求较多,UDP对系统资源要求较少。

浏览器访问consul服务,,验证集群信息。
docker服务发现实时监控_第1张图片
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
docker服务发现实时监控
验证conusl上的nginx服务
docker服务发现实时监控_第2张图片

[root@docker3 桌面]# docker run -d -P --name test nginx
e7c2453916b3e40bbc73db25913633d9793952f27dc4b51d5a7fe44157c4c55c
docker服务发现实时监控_第3张图片

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;
docker服务发现实时监控

在本主机,通过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
docker服务发现实时监控

当然:这时不管后端是新添加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容器的服务信息