如何部署Docker+Consul+registrator架構(gòu)實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)

假設(shè)我們寫的代碼會調(diào)用 REST API 或者 Thrift API 的服務(wù)。為了完成一次請求,代碼需要知道服務(wù)實(shí)例的網(wǎng)絡(luò)位置(IP 地址和端口)。

成都創(chuàng)新互聯(lián)公司擁有網(wǎng)站維護(hù)技術(shù)和項(xiàng)目管理團(tuán)隊(duì),建立的售前、實(shí)施和售后服務(wù)體系,為客戶提供定制化的成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、服務(wù)器托管解決方案。為客戶網(wǎng)站安全和日常運(yùn)維提供整體管家式外包優(yōu)質(zhì)服務(wù)。我們的網(wǎng)站維護(hù)服務(wù)覆蓋集團(tuán)企業(yè)、上市公司、外企網(wǎng)站、商城網(wǎng)站建設(shè)、政府網(wǎng)站等各類型客戶群體,為全球上1000家企業(yè)提供全方位網(wǎng)站維護(hù)、服務(wù)器維護(hù)解決方案。

運(yùn)行在物理硬件上的傳統(tǒng)應(yīng)用中,服務(wù)實(shí)例的網(wǎng)絡(luò)位置是相對固定的,代碼能從一個(gè)偶爾更新的配置文件中讀取網(wǎng)絡(luò)位置。

對于基于云端的、現(xiàn)代化的微服務(wù)應(yīng)用而言,這卻是一大難題。將容器應(yīng)用部署到集群時(shí),其服務(wù)地址是由集群系統(tǒng)動(dòng)態(tài)分配的。那么,當(dāng)我們需要訪問這個(gè)服務(wù)時(shí),如何確定它的地址呢?這時(shí)就需要服務(wù)發(fā)現(xiàn)(Service Discovery)了。

Docker+Consul+registrator實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)
實(shí)驗(yàn)環(huán)境
Docker01    192.168.2.10
Docker02    192.168.2.20
Docker03    192.168.2.30
關(guān)閉防火墻和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    ##確認(rèn)命令可用
1)在docker01上啟動(dòng)consul服務(wù)
//啟動(dòng)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
后臺運(yùn)行
[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:加入這個(gè)選項(xiàng)時(shí),一般都在server單節(jié)點(diǎn)的時(shí)候用,自選舉為leader。
-ui:開啟內(nèi)部的web頁面      -data-dir:key/volum數(shù)據(jù)存儲位置
-bind:指定開啟服務(wù)的IP
-client:指定訪問的客戶端    
-node:指定集群內(nèi)通信使用的名稱。默認(rèn)是主機(jī)名
PS:開啟的端口
8300    集群節(jié)點(diǎn)
8301    集群內(nèi)部的訪問
8302    跨數(shù)據(jù)中心的通信
8500    web ui 界面
8600    使用DNS協(xié)議查看節(jié)點(diǎn)信息的端口
//查看consul的信息
[root@docker01 ~]# consul info
leader_addr = 192.168.2.10:8300
//查看集群內(nèi)成員的信息
[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集群
這里我們采用容器的方式去運(yùn)行consul服務(wù)。myprogrium-consul.tar
docker load < myprogrium-consul.tar  
報(bào)錯(cuò)重啟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臺主機(jī)
如何部署Docker+Consul+registrator架構(gòu)實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)

瀏覽器訪問本機(jī)的8500端口
如何部署Docker+Consul+registrator架構(gòu)實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)

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服務(wù)
registrator是一個(gè)能自動(dòng)發(fā)現(xiàn)docker container提供的服務(wù),并在后端服務(wù)注冊中心注冊服務(wù)或取消服務(wù)的工具,后端注冊中心支持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上創(chuàng)建一個(gè)nginx容器
[root@docker02 ~]# docker run -d -P --name test nginx
驗(yàn)證conusl上的nginx服務(wù)
如何部署Docker+Consul+registrator架構(gòu)實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)

5)docker01部署一個(gè)ngixn服務(wù)
[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的容器服務(wù),所以我們先去docker02、docker03上部署一些服務(wù),為了方便等會回看到負(fù)載的效果,所以,我們運(yùn)行完成容器之后,做一個(gè)主界面內(nèi)容的區(qū)分
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服務(wù)的配置文件
[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"
后臺運(yùn)行
[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      ##生成一個(gè)vhost.conf文件
nginx.ctmpl  vhost.conf
[root@docker01 consul]# cat vhost.conf
如何部署Docker+Consul+registrator架構(gòu)實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)

查看8000端口是否起來
[root@docker01 consul]# ss -lnt
沒起來,重啟nginx
[root@docker01 consul]# nginx -s reload
訪問本機(jī)的8000端口
[root@docker01 ~]# curl 127.0.0.1:8000
如何部署Docker+Consul+registrator架構(gòu)實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)
當(dāng)然:這時(shí)不管后端是新添加nginx的web容器,或是刪除,新生產(chǎn)的配置文件都會實(shí)時(shí)的更新,這是我們在運(yùn)行consul-template這條命令添加的模板。

名稱欄目:如何部署Docker+Consul+registrator架構(gòu)實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)
網(wǎng)頁鏈接:http://muchs.cn/article12/jopegc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)微信公眾號、品牌網(wǎng)站建設(shè)、網(wǎng)站改版標(biāo)簽優(yōu)化、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站