實驗:
1)整理docker實現服務發現的過程,及設計到的組件和組件的租用
服務發現流程html
Docker 》 registrator 》 consul 》 consul-template 》 nginx
總結:
Consul :分佈式,高可用,服務發現和配置服務的工具。數據中心。
Registrator:負責收集dockerhost上,容器服務的信息,而且發送給consul。
Consul-template:根據編輯好的模板。生產新的nginx配置文件,並負責從新加載nginx配置文件。node
2)服務發現爲:nginx的container服務。主界面內容作區分:要包含本身的名稱。
錄像2遍,文檔一遍。
服務發現linux
關閉各個虛擬機防火牆,禁用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.nginx
[root@docker ~]# setenforce 0
[root@docker ~]# systemctl restart docker
Docker + Consul + registrator實現服務發現
實驗環境:consul:多數據中心
Docker01 docker02 docker03
192.168.1.1 1.20 1.30web
導入包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 docker
[root@docker ~]# mv consul /usr/local/bin/
[root@docker ~]# chmod +x /usr/local/bin/consul
[root@docker ~]# consul -hbootstrap
改時間
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"vim
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
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的區別: 一、TCP與UDP區別總結: 一、TCP面向鏈接(如打電話要先撥號創建鏈接);UDP是無鏈接的,即發送數據以前不須要創建鏈接 二、TCP提供可靠的服務。也就是說,經過TCP鏈接傳送的數據,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付 Tcp經過校驗和,重傳控制,序號標識,滑動窗口、確認應答實現可靠傳輸。如丟包時的重發控制,還能夠對次序亂掉的分包進行順序控制。 三、UDP具備較好的實時性,工做效率比TCP高,適用於對高速傳輸和實時性有較高的通訊或廣播通訊。 4.每一條TCP鏈接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通訊 五、TCP對系統資源要求較多,UDP對系統資源要求較少。
瀏覽器訪問consul服務,,驗證集羣信息。
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
驗證conusl上的nginx服務
[root@docker3 桌面]# docker run -d -P --name test nginx
e7c2453916b3e40bbc73db25913633d9793952f27dc4b51d5a7fe44157c4c55c
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;
在本主機,經過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
固然:這時無論後端是新添加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容器的服務信息