consul:高可用,分佈式的服務發現的工具html
master主機—docker01:172.16.1.30
node01主機—docker02:172.16.1.31
node02主機—docker03:172.16.1.32node
注意:由於是測試環境,因此暫時關閉防火牆,禁用selinux,若是是對外網發佈的服務器,是不能夠關閉防火牆,能夠設置iptables規則。linux
(1)docker01上部署consul:
下載或上傳consul_1.5.1_linux_amd64軟件包:nginx
[root@sqm-docker01 ~]# unzip consul_1.5.1_linux_amd64.zip #使用unzip工具進行一個解壓 [root@sqm-docker01 ~]# mv consul /usr/local/bin/ [root@sqm-docker01 ~]# chmod +x /usr/local/bin/consul
[root@sqm-docker01 ~]# consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data \ > -bind=172.16.1.30 \ #docker01本機的ip地址 > -client=0.0.0.0 \ > -node=master
參數解釋:
-server:添加一個服務
-bootstrap:通常在server單節點的時候使用,自選舉爲leader。
-data-dir:指定數據存放的目錄
-ui:開啓內部的web界面
-bind:指定開啓服務的ip
-client:指定服務的客戶端
-node:在集羣內部通訊使用的名稱,默認是主機名。git
####保持後臺運行consul服務:[root@sqm-docker01 ~]# nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=172.16.1.30 -client=0.0.0.0 -node=master &
github
執行後臺運行後,會在當前目錄下生成一個文件,生成全部的集羣信息都會保存在這個文件內:
##查看服務端口是否運行:
web
8300: 集羣節點(對外公佈的)
8301: 集羣內部訪問
8302: 跨數據中心之間的通訊
8500: http--UI
8600: dns算法
##查看consul信息:[root@sqm-docker01 ~]# consul info
docker
說明:consul信息中多爲一些算法,這些算法保證數據的同步,以及加上-bootstrap自選舉爲leader,也是經過這些算法來實現的。
bootstrap
##查看集羣內部信息:[root@sqm-docker01 ~]# consul members
登錄訪問web界面:http://172.16.1.30:8500
(2)docker02上操做:
部署consul服務:
下載progrium/consul鏡像:[root@sqm-docker02 ~]# docker pull myprogrium-consul
##建立一個consul容器,而且加入consul集羣中:[root@sqm-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 -join 172.16.1.30 -advertise 172.16.1.31 -client 0.0.0.0 -node=node01
解釋:
-join:加入的是docker01的集羣,因此指定的是docker01的主機地址
-advertise:通告的是本機(docker02)的地址,
-client:表示因此主機訪問該節點
-node:自定義節點名稱爲node01
確保容器已正常運行:
在網頁上查看該節點是否加入:
(3)在docker03上操做:
一樣的下載progrium/consul鏡像:[root@sqm-docker02 ~]# docker pull myprogrium-consul
運行容器並加入集羣:[root@sqm-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 -join 172.16.1.30 -advertise 172.16.1.32 -client 0.0.0.0 -node=node02
#注意須要通告的是自身的ip地址,節點名稱爲node02
加入集羣后,在docker01上查看集羣信息:
[root@sqm-docker01 ~]# consul members
瀏覽web界面查看:
確保node1和node2都已經加入到了集羣中
(4)在docker01上安裝consul-template:
該軟件包能夠在github上進行下載,下載路徑(可自定義選擇版本):https://releases.hashicorp.com/consul-template/
下載後解壓,並給予執行權限:
[root@sqm-docker01 ~]# unzip consul-template_0.19.5_linux_amd64.zip Archive: consul-template_0.19.5_linux_amd64.zip inflating: consul-template [root@sqm-docker01 ~]# mv consul-template /usr/local/bin/ [root@sqm-docker01 ~]# chmod +x /usr/local/bin/consul-template
暫時先安裝完,不作其餘操做。
(5)部署registrator:
主要用來收集容器運行服務的信息,而且發送給consul。
自動發現docker container提供的服務,而且在後端服務註冊中心(數據中心)註冊服務。
常見的數據中心有:consul,etcd,zookeeper,相關的技術能夠查找相關的技術文檔。
注意:#兩臺都要部署
docker02:
我導入了一個本地下載好的鏡像(在pull進行拉取):[root@sqm-docker02 ~]# docker load --input myregistrator.tar
運行一個registrator容器:[root@sqm-docker02 ~]# docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator consul://172.16.1.31:8500
以上命令的做用是把收集過來容器的信息給本機的8500端口來顯示
訪問web網頁查看是否收集到容器的信息:
url:http://172.16.1.30:8500/
如今在docker02上運行一個ngnx服務,測試是否可以發現:[root@sqm-docker02 ~]# docker run -d -P --name test nginx
docker03:
執行在docker02一樣的操做,查看是否可以發現服務:
下載鏡像並建立容器:
[root@sqm-docker03 ~]# docker run -d --name registrator -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator consul://172.16.1.32:8500
運行nginx服務:[root@sqm-docker03 ~]# docker run -d --name test2 -P nginx
確保容器正常運行:
web網頁進行查看:
確保也可以收集到node2上的nginx容器信息。
(6)在docker01上部署nginx,提供反向代理:
1)安裝nginx:
安裝依賴:[root@sqm-docker01 ~]# yum -y install gcc pcre pcre-devel openssl openssl-devel zlib zlib-devel
建立nginx用戶[root@sqm-docker01 ~]# useradd -M -s /usr/sbin/nologin nginx
編譯安裝:
[root@sqm-docker01 ~]# tar zxf nginx-1.14.0.tar.gz -C /usr/src/ [root@sqm-docker01 ~]# cd /usr/src/nginx-1.14.0/ [root@sqm-docker01 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 && make && make install
軟連接:[root@sqm-docker01 ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
啓動nginx:[root@sqm-docker01 ~]# nginx
2)如今就開始部署剛纔安裝完的consul-template插件了
consul-template的做用:把收集到的信息(把registrator收集到容器的信息)寫入template模板中,而且最終寫入nginx的配置文件中,經過該模板來實現自動化。
##編寫consul-template網頁:
[root@sqm-docker01 ~]# cd /usr/local/nginx/ [root@sqm-docker01 nginx]# mkdir consul #在nginx目錄下建立存放template網頁的目錄 [root@sqm-docker01 nginx]# cd consul/ [root@sqm-docker01 consul]# vim nginx.ctmpl
內容以下(以go語言實現):
upstream http_backend { {{range service "nginx"}} server {{.Address}}:{{.Port}}; {{ end }} } server { listen 8000; #監聽端口能夠自定義,只要不與本身的80端口衝突便可 server_name localhost; location / { proxy_pass http://http_backend; } }
##修改nginx配置文件:[root@sqm-docker01 consul]# vim /usr/local/nginx/conf/nginx.conf
//根據剛纔的模板生成一個.conf文件:
[root@sqm-docker01 consul]# consul-template -consul-addr 172.16.1.30:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/sbin/nginx -s reload"
注意:執行命令回車後將會卡在終端,因此接下來咱們另開一個終端查看。
也能夠將其設置爲後臺運行:(加上nohup和&參數):[root@sqm-docker01 consul]# nohup consul-template -consul-addr 172.16.1.30:8500 -template "/usr/local/nginx/consul/nginx.ctmpl:/usr/local/nginx/consul/vhost.conf:/usr/local/sbin/nginx -s reload" &
##能看到vhost文件中有node01和node02的地址及端口號,說明nginx代理成功。
(7)實現服務自動發現:
爲了驗證明現服務發現,在docker02和docker03上建立容器:(基於nginx服務運行)
操做命令以下:
docker02:
mkdir html echo docker02_web01 > html/index.conf docker run -itd --name web01 -v /root/html:/usr/share/nginx/html -P nginx
爲了更直觀的看到,咱們運行第二個nginx容器:
docker run -itd --name web02 -P nginx:latest docker exec -it web02 /bin/bash echo docker02_web02 > /usr/share/nginx/html/index.html
docker03:(一樣的建立兩個容器):
docker run -itd --name web03 -P nginx:latest docker exec -it web03 /bin/bash echo docker03-web01 > /usr/share/nginx/html/index.html
docker run -itd --name web04 -P nginx:latest docker exec -it web04 /bin/bash echo docker03-web02 > /usr/share/nginx/html/index.htm
最後驗證自動發現的nginx頁面:
訪問的是代理nginx服務器的地址跟上自定義的訪問端口8000
URL:http://172.16.1.30:8000/
第一次訪問的頁面是代理服務器自身的nginx頁面:
第二次訪問到的是docker02上的第一個nginx頁面:
第三次訪問到的是docker02上的第二個nginx頁面:
docker03上的nginx1頁面:
docker03上的nignx2頁面:
至此在Docker上部署集羣,實現服務的一個自動發現,已經搭建並測試完畢。。。。。
———————— 本文至此結束,感謝閱讀 ————————