Docker集群搭建-Consul

736 查看

基础环境准备

在阿里云服务器上搭建公司私有仓库

  • 搭建私有镜像仓库(操作对象:xytech-即阿里云服务器);
    请参照这篇文章:Docker Registry搭建私有仓库批量上传镜像到私有仓库

  • 私有仓库的使用;

    # 在客户端主机创建文件夹(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镜像(操作对象:三台主机);

    # 这里直接拉取可用的镜像
    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配置信息,用于修改本地配置文件,如下图:

    • 更改本地配置文件“/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集群的情况(如下图);

配合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集群和分布式服务的情况(如下图);

  • 查看客户端的日志可以看到Consul集群各节点中的分布式服务的部署情况(如下图);

    # 操作对象:Docker03
    docker logs -f docker-03-clien