建立虛擬機;node
主機說明;
json
開啓並配置ssh服務;bootstrap
安裝Docker;vim
搭建私有鏡像倉庫(操做對象:xytech-即阿里雲服務器);
請參照這篇文章:Docker Registry搭建私有倉庫和批量上傳鏡像到私有倉庫segmentfault
私有倉庫的使用;瀏覽器
# 在客戶端主機建立文件夾(DomainName:Port例如example.com:9527) mkdir -p /etc/docker/certs.d/DomainName:Port # 先將ca.crt文件傳到客戶端主機 # 在ca.crt的當前目錄下將該證書複製到上面建立的文件夾 cp ca.crt /etc/docker/certs.d/DomainName:Port/ # 重啓docker服務 service docker restart # 接下來就能夠從私有倉庫拉取鏡像或向其上傳鏡像了。
建立Consul服務的Docker鏡像(操做對象:三臺主機);ruby
# 這裏直接拉取可用的鏡像 docker pull willem.top:6666/mongo-consul && docker tag willem.top:6666/mongo-consul mongo-consul && docker rmi willem.top:6666/mongo-consul
修改主機的配置文件(操做對象:三臺主機);服務器
獲取docker0的ip配置信息,用於修改本地配置文件,以下圖:
app
更改本地配置文件「/etc/default/docker」
vim /etc/default/docker
本地配置文件編輯內容以下
DOCKER_OPTS="--dns 172.17.0.1 --dns 8.8.8.8 --dns-search service .consul"
啓動具備自啓動功能的Consul節點(操做對象:Docker01);
# 1.建立工做目錄 mkdir -p /opt/consul # 2.進入工做目錄 cd /opt/consul # 3.在工做目錄中建立啓動具備自啓動功能的Consul節點的腳本 vim consul-start.sh # 4.編輯啓動具備自啓動功能的Consul節點的腳本內容以下(請根據本身的狀況更改鏡像名稱以及ip地址-查詢方式:ifconfig) docker rm -f consul01 docker run -d \ --restart always \ -h $HOSTNAME \ -p 8300:8300 \ -p 8301:8301 \ -p 8301:8301/udp \ -p 8302:8302 \ -p 8302:8302/udp \ -p 8400:8400 \ -p 8500:8500 \ -p 53:53/udp \ --name consul01 mongo-consul \ -server -advertise 192.168.2.129 -bootstrap-expect 3 # 5.給腳本賦予可執行權限(也可以使用相對路徑:chmod +x ./consul-start.sh) chmod +x /opt/consul/consul-start.sh # 6.執行腳本(也可以使用相對路徑:./consul-start.sh) /opt/consul/consul-start.sh
啓動Docker02的Consul節點(操做對象:Docker02);
# 1.建立工做目錄 mkdir -p /opt/consul # 2.進入工做目錄 cd /opt/consul # 3.在工做目錄中建立啓動具備自啓動功能的Consul節點的腳本 vim consul-start.sh # 4.編輯啓動具備自啓動功能的Consul節點的腳本內容以下(請根據本身的狀況更改鏡像名稱以及ip地址) docker rm -f consul02 docker run -d \ --restart always \ -h $HOSTNAME \ -p 8300:8300 \ -p 8301:8301 \ -p 8301:8301/udp \ -p 8302:8302 \ -p 8302:8302/udp \ -p 8400:8400 \ -p 8500:8500 \ -p 53:53/udp \ --name consul02 mongo-consul \ -server -advertise 192.168.2.56 -join 192.168.2.129 # 5.給腳本賦予可執行權限(也可以使用相對路徑:chmod +x ./consul-start.sh) chmod +x /opt/consul/consul-start.sh # 6.執行腳本(也可以使用相對路徑:./consul-start.sh) /opt/consul/consul-start.sh
啓動Docker03的Consul節點(操做對象:Docker03);
Docker03跟Docker02的操做惟一的區別就是在第4步的配置文件中的內容稍有變化,內容以下:
docker rm -f consul03 docker run -d \ --restart always \ -h $HOSTNAME \ -p 8300:8300 \ -p 8301:8301 \ -p 8301:8301/udp \ -p 8302:8302 \ -p 8302:8302/udp \ -p 8400:8400 \ -p 8500:8500 \ -p 53:53/udp \ --name consul03 mongo-consul \ -server -advertise 192.168.2.77 -join 192.168.2.129
其餘的操做根據Docker02來便可。
經過瀏覽器訪問下面的網址便可查看Consul集羣的狀況(以下圖);
建立並進入工做目錄(操做對象:三臺主機);
mkdir -p /opt/disapp cd /opt/disapp
獲取基礎鏡像並修改鏡像名稱和標籤(若是從底層鏡像開始構建過於麻煩,這裏直接修改替換配置文件來構建新鏡像)
# 操做對象:Docker01和Docker02 docker pull willem.top:6666/mongo-app && docker tag willem.top:6666/mongo-app mongo-app && docker rmi willem.top:6666/mongo-app # 操做對象:Docker03 docker pull willem.top:6666/mongo-client && docker tag willem.top:6666/mongo-client mongo-client && docker rmi willem.top:6666/mongo-client
建立並編輯Dockerfile(內容以下)
# 操做對象:Docker01和Docker02 FROM mongo-app MAINTAINER Mong <willem@xcloudbiz.com> ADD uwsgi-consul.ini /opt/distributed_app/ # 操做對象:Docker03 FROM mongo-client MAINTAINER Mong <willem@xcloudbiz.com> ADD client.rb /opt/distributed_client/
建立並編輯配置文件
操做對象:Docker01
vim uwsgi-consul.ini # 編輯配置文件內容以下(-根據本身的狀況修改ip,如今用hosts映射還有些問題,暫時先用ip,%h等同於hostname) [uwsgi] plugins = consul socket = 127.0.0.1:9999 master = true enable-threads = true [server1] consul-register = url=http://192.168.2.129:8500,name=distributed_app,id=server1,port=2001 mule = config.ru [server2] consul-register = url=http://192.168.2.129:8500,name=distributed_app,id=server2,port=2002 mule = config.ru
操做對象:Docker02
vim uwsgi-consul.ini # 編輯配置文件內容以下 [uwsgi] plugins = consul socket = 127.0.0.1:9999 master = true enable-threads = true [server1] consul-register = url=http://192.168.2.56:8500,name=distributed_app,id=server1,port=2001 mule = config.ru [server2] consul-register = url=http://192.168.2.56:8500,name=distributed_app,id=server2,port=2002 mule = config.ru
操做對象:Docker03
vim client.rb # 編輯配置文件內容以下 require "rubygems" require "json" require "net/http" require "uri" require "resolv" empty = "There are no distributed applications registered in Consul" uri = URI.parse("http://172.17.0.1:8500/v1/catalog/service/distributed_app") http = Net::HTTP.new(uri.host, uri.port) request = Net::HTTP::Get.new(uri.request_uri) response = http.request(request) while true if response.body == "{}" puts empty sleep(1) elsif result = JSON.parse(response.body) result.each do |service| puts "Application #{service['ServiceName']} with element #{service["ServiceID"]} on port #{service["ServicePort"]} found on node #{service["Node"]} (#{service["Address"]})." dns = Resolv::DNS.new.getresources("distributed_app.service.consul", Resolv::DNS::Resource::IN::A) puts "We can also resolve DNS - #{service['ServiceName']} resolves to #{dns.collect { |d| d.address }.join(" and ")}." sleep(1) end end end
構建新鏡像
# 操做對象:Docker01和Docker02 docker build -t mongo-app-add . # 操做對象:Docker03 docker build -t mongo-client-add .
啓動分佈式服務的應用和客戶端
# 操做對象:Docker01和Docker02 docker run --restart always -h $HOSTNAME -d --name docker-02-app mongo-app-add # 操做對象:Docker03 docker run --restart always -h $HOSTNAME -d --name docker-03-client mongo-client-add
經過瀏覽器訪問下面的網址便可查看Consul集羣和分佈式服務的狀況(以下圖);
查看客戶端的日誌能夠看到Consul集羣各節點中的分佈式服務的部署狀況(以下圖);
# 操做對象:Docker03 docker logs -f docker-03-clien