基础环境准备
主机说明;
在阿里云服务器上搭建公司私有仓库
搭建私有镜像仓库(操作对象: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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。