Docker+Consul+registrator实现服务发现
环境准备
docker | docker2 | docker3 |
---|---|---|
192.168.229.187 | 192.168.229.40 | 192.168.229.50 |
全部关闭防火墙和selinux,且主机名不能冲突。
一、consul服务的部署
1.docker上部署启动consul服务(压缩包传到docker上)
[root@docker ~]# unzip consul_1.5.1_linux_amd64.zip
[root@docker ~]# mv consul /usr/local/bin/
[root@docker ~]# chmod +x /usr/local/bin/consul
启动consul
[root@docker ~]# consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.229.187 -client=0.0.0.0 -node=master
参数解释
-bootstrap:加入这个选项时,一般都在server单节点时用,自选举为leader;
-ui:开启内部的web页面;
-data-dir:key/volume数据存储位置;
-bind:指定开启服务的IP;
-client:指定访问的客户端;
-node:指定集群内通信使用的名称(默认是主机名);
开启的端口
8300:集群节点;
8301:集群内部的访问;
8302:跨数据中心的通信;
8500:web ui界面;
8600:使用dns协议查看节点信息的端口;
这条命令会占用终端,可以使用nohup命令让它保持后台运行。
[root@docker ~]# nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.229.187 -client=0.0.0.0 -node=master &
查看consul的信息
[root@docker ~]# consul info
查看consul集群内成员的信息
[root@docker ~]# consul members
2.把docker2、docker3加入consul集群(采用容器的方式运行consul服务)
[root@docker2 ~]# 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.229.187 -advertise 192.168.229.40 -client 0.0.0.0 -node=node1
[root@docker3 ~]# 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.229.187 -advertise 192.168.229.50 -client 0.0.0.0 -node=node2
浏览器访问consul服务,验证集群信息。
192.168.229.187:8500
3.在docker2、docker3上部署registrator服务
registrator是一个能自动发现docker container提供的服务,并在后端服务注册中心注册服务或取消服务的工具,后端注册中心支持conusl、etcd、skydns2、zookeeper等。
[root@docker2 ~]# docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart always gliderlabs/registrator consul://192.168.229.40:8500
[root@docker3 ~]# docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart always gliderlabs/registrator consul://192.168.229.50:8500
4.docker上部署一个nginx服务
[root@docker ~]# yum -y install gcc gcc-c++ openssl openssl-devel zlib zlib-devel pcre pcre-devel
[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 --prefix=/usr/local/nginx --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/sbin/
[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
[root@docker nginx-1.14.0]# nginx
注意:这里nginx作为反向代理,代理后端docker2、docker3上nginx的容器服务,所以先在docker2、docker3上部署一些服务,为了方便等会看到负载的效果,所以运行完成容器后,做一个主界面内容的区分。
docker2 | docker3 |
---|---|
web1 web2 | web3 web4 |
[root@docker2 ~]# docker run -itd --name web1 --restart always -p 80 nginx
[root@docker2 ~]# docker exec -it web1 bash
root@b75c7ab5544c:/# echo web11111111 > /usr/share/nginx/html/index.html
[root@docker2 ~]# docker run -itd --name web2 --restart always -p 80 nginx
[root@docker2 ~]# docker exec -it web2 bash
root@b75c7ab5544c:/# echo web22222222 > /usr/share/nginx/html/index.html
[root@docker3 ~]# docker run -itd --name web3 --restart always -p 80 nginx
[root@docker2 ~]# docker exec -it web3 bash
root@b75c7ab5544c:/# echo web33333333 > /usr/share/nginx/html/index.html
[root@docker3 ~]# docker run -itd --name web4 --restart always -p 80 nginx
[root@docker3 ~]# docker exec -it web4 bash
root@b75c7ab5544c:/# echo web44444444 > /usr/share/nginx/html/index.html
更改nginx服务的配置文件
[root@docker nginx]# mkdir consul
[root@docker nginx]# cd consul
[root@docker consul]# pwd
/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 consul]# cd ../conf
[root@docker conf]# pwd
/usr/local/nginx/conf
[root@docker conf]# vim nginx.conf
文件最后添加:
...
include /usr/local/nginx/consul/*.conf;
}
[root@docker conf]# nginx -t
[root@docker conf]# nginx -s reload
安装consul-template命令(压缩包传到docker上)
[root@docker ~]# unzip consul-template_0.19.5_linux_amd64.zip
[root@docker ~]# mv consul-template /usr/local/bin/
[root@docker ~]# chmod +x /usr/local/bin/consul-template
使用consul-template命令,根据模板产生新的配置文件,并重新加载nginx的配置文件
[root@docker ~]# consul-template -consul-addr 192.168.229.187:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/sbin/nginx -s reload"
这条命令会占用终端,可以使用nohup命令让它保持后台运行
[root@docker ~]# nohup consul-template -consul-addr 192.168.229.187:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/sbin/nginx -s reload" &
此时能够看到新产生的vhost.conf配置文件已经生效,访问本机8000端口可以得到不同容器提供的服务。
[root@docker consul]# pwd
/usr/local/nginx/consul
[root@docker consul]# cat vhost.conf
[root@docker consul]# curl localhost:8000
当然,这时不管后端是新添加nginx的web容器,或是删除,新产生的配置文件都会实时的更新,这是在运行consul-template这条命令最后添加:/usr/local/sbin/nginx -s reload的作用。