Docker+Consul+registrator實現服務發現

Docker+Consul+registrator實現服務發現
實驗環境
Docker01 192.168.2.10
Docker02 192.168.2.20
Docker03 192.168.2.30
關閉防火牆和selinux。consul_1.5.1_linux_amd64.zip
[root@docker01 ~]# unzip consul_1.5.1_linux_amd64.zip
[root@docker01 ~]# mv consul /usr/local/bin/
[root@docker01 ~]# chmod +x /usr/local/bin/consul
[root@docker01 ~]# consul --help ##確認命令可用
1)在docker01上啓動consul服務
//啓動consul
[root@docker01 ~]# consul agent -server -bootstrap \

-ui -data-dir=/var/lib/consul-data \
-bind=192.168.2.10 \
-client=0.0.0.0 \
-node=master
後臺運行
[root@docker01 ~]# nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.2.10 -client=0.0.0.0 -node=master &
[1] 17633
[root@docker01 ~]# 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@docker01 ~]# consul info
leader_addr = 192.168.2.10:8300
//查看集羣內成員的信息
[root@docker01 ~]# consul members
Node Address Status Type Build Protocol DC Segment
master 192.168.2.10:8301 alive server 1.5.1 2 dc1 <all>
2)docker02、docker03,加入consul集羣
這裏我們採用容器的方式去運行consul服務。myprogrium-consul.tar
docker load < myprogrium-consul.tar
報錯重啓docker:
Systemctl restart docker
[root@docker02 ~]# docker run -d --name consul -p 8301:8301 -p 8301:8301/udp -p 8500:8500 -p 8600:8600/udp --restart always progrium/consul:latest -join 192.168.2.10 -advertise 192.168.2.20 -client 0.0.0.0 -node=node01
[root@docker03 ~]# docker run -d --name consul -p 8301:8301 -p 8301:8301/udp -p 8500:8500 -p 8600:8600/udp --restart always progrium/consul:latest -join 192.168.2.10 -advertise 192.168.2.30 -client 0.0.0.0 -node=node02
[root@docker01 ~]# consul members ##可查詢到3臺主機
Docker+Consul+registrator實現服務發現

瀏覽器訪問本機的8500端口
Docker+Consul+registrator實現服務發現

3)下載部署consul-template
consul-template_0.19.5_linux_amd64.zip
[root@docker01 ~]# unzip consul-template_0.19.5_linux_amd64.zip
[root@docker01 ~]# mv consul-template /usr/local/bin/
[root@docker01 ~]# chmod +x /usr/local/bin/consul-template
4)docker02、docker03上部署registrator服務
registrator是一個能自動發現docker container提供的服務,並在後端服務註冊中心註冊服務或取消服務的工具,後端註冊中心支持conusl、etcd、skydns2、zookeeper等。
myregistrator.tar
[root@docker02 ~]# docker load < myregistrator.tar
[root@docker02 ~]# docker run -d \

--name registrator \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart always \
gliderlabs/registrator \
consul://192.168.2.20:8500
[root@docker03 ~]# docker load < myregistrator.tar
[root@docker03 ~]# docker run -d \
--name registrator \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart always \
gliderlabs/registrator \
consul://192.168.2.30:8500
Docker2上創建一個nginx容器
[root@docker02 ~]# docker run -d -P --name test nginx
驗證conusl上的nginx服務
Docker+Consul+registrator實現服務發現

5)docker01部署一個ngixn服務
[root@docker01 ~]# yum -y install gcc openssl openssl-devel zlib zlib-devel pcre pcre-devel
[root@docker01 ~]# useradd -M -s /sbin/nologin nginx
[root@docker01 ~]# tar zxf nginx-1.14.0.tar.gz
[root@docker01 ~]# cd nginx-1.14.0/
nginx-1.14.0.tar.gz
[root@docker01 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@docker01 nginx-1.14.0]# make && make install
[root@docker01 nginx-1.14.0]# ln -s /usr/local/nginx/sbin/* /usr/local/bin/
[root@docker01 nginx-1.14.0]# nginx -t
[root@docker01 nginx-1.14.0]# nginx
PS:這裏nginx作爲反向代理,代理後端docker02、docker03上nginx的容器服務,所以我們先去docker02、docker03上部署一些服務,爲了方便等會回看到負載的效果,所以,我們運行完成容器之後,做一個主界面內容的區分
Docker02:web01 web02
[root@docker02 ~]# docker run -itd --name web01 -P nginx:latest
[root@docker02 ~]# docker exec -it web01 /bin/bash
root@b47619f3f7ae:/# echo The web container in docker02-web01 > /usr/share/nginx/html/index.html
[root@docker02 ~]# docker run -itd --name web02 -P nginx:latest
[root@docker02 ~]# docker exec -it web02 /bin/bash
root@89cc41040e33:/# echo The web container in docker02-web02 > /usr/share/nginx/html/index.html
Docker03:web03 web04
[root@docker03 ~]# docker run -itd --name web03 -P nginx:latest
[root@docker03 ~]# docker exec -it web03 /bin/bash
root@3f0d20853b0b:/# echo The web container in docker03-web03 > /usr/share/nginx/html/index.html
[root@docker03 ~]# docker run -itd --name web04 -P nginx:latest
[root@docker03 ~]# docker exec -it web04 /bin/bash
root@79168d0aa77f:/# echo The web container in docker03-web04 > /usr/share/nginx/html/index.html
更改nginx服務的配置文件
[root@docker01 ~]# cd /usr/local/nginx/
[root@docker01 nginx]# mkdir consul
[root@docker01 nginx]# cd consul/
[root@docker01 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@docker01 nginx]# cd ../conf/
[root@docker01 conf]# vim nginx.conf

include /usr/local/nginx/consul/*.conf;
//是nginx的主配置文件能夠識別到新的
[root@docker01 conf]# consul-template -consul-addr 192.168.2.10:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/bin/nginx -s reload"
後臺運行
[root@docker01 conf]# nohup consul-template -consul-addr 192.168.2.10:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/bin/nginx -s reload" &
[root@docker01 conf]# nohup: 忽略輸入並把輸出追加到"nohup.out"
[root@docker01 consul]# pwd
/usr/local/nginx/consul
[root@docker01 consul]# ls ##生成一個vhost.conf文件
nginx.ctmpl vhost.conf
[root@docker01 consul]# cat vhost.conf
Docker+Consul+registrator實現服務發現

查看8000端口是否起來
[root@docker01 consul]# ss -lnt
沒起來,重啓nginx
[root@docker01 consul]# nginx -s reload
訪問本機的8000端口
[root@docker01 ~]# curl 127.0.0.1:8000
Docker+Consul+registrator實現服務發現
當然:這時不管後端是新添加nginx的web容器,或是刪除,新生產的配置文件都會實時的更新,這是我們在運行consul-template這條命令添加的模板。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章