Docker集羣搭建-Consul

基礎環境準備

在阿里雲服務器上搭建公司私有倉庫

  • 搭建私有鏡像倉庫(操做對象: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
    # 接下來就能夠從私有倉庫拉取鏡像或向其上傳鏡像了。

Docker集羣搭建-Consul

  • 建立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配置信息,用於修改本地配置文件,以下圖:
      clipboard.pngapp

    • 更改本地配置文件「/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集羣的狀況(以下圖);
    clipboard.png

配合Consul在Docker中運行分佈式服務

  • 建立並進入工做目錄(操做對象:三臺主機);

    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集羣和分佈式服務的狀況(以下圖);
    clipboard.png

  • 查看客戶端的日誌能夠看到Consul集羣各節點中的分佈式服務的部署狀況(以下圖);

    # 操做對象:Docker03
    docker logs -f docker-03-clien

    clipboard.png

相關文章
相關標籤/搜索