1、环境说明:html
1.一台虚拟机,该系统已经装好了docker;node
ip 192.168.10.224 虚拟网卡,与主机互通nginx
操做系统rhel6 内核 2.6.32 64位docker
docker版本 1.7.1json
2.一台主机bootstrap
ip 192.168.10.103windows
操做系统windows server 2008R 64位api
ningx版本 1.8.0浏览器
2、思路及部署图app
consul-Server 是运行在docker里的consul实例的server模式,能够经过DNS或者HTTP接口使服务注册并对容器进行健康状态检查,consul-registrator能够经过监听docker的start和stop事件来获取启动的实例的端口和ip配置,并经过consul-server提供的api注册接口注册到consul服务里。这里有一点须要注意,docker的restart方法貌似监视不到。另外比consul-registrator先启动的实例,也是没法监听到的,因此在部署的时候须要注意一下启动顺序。这里已经把最重要的一部分,自动监听注册docker实例的ip和端口完成了,接下来须要借助consul-template将consul-server中注册的服务拉去同步并写到nginx配置中,再从新启动nginx就能够了。consul-template会实时监控consul-server中的服务和状态,将新添加的服务和已经移除的服务,经过一个配置的模板写到一个指定的文件中,这里咱们指定的文件就是nginx的配置了。另外介绍一下ngingx,它是能够热启动的,也就是在工做状态下从新加载配置,主要是nginx启动时会开启俩个实例,一个master实例监控配置信息,另一个实例作负载和转发。总体思路就是这样,有须要了解其具体技术的,博客园里有不少介绍,这里就不具体再介绍了。
3、步骤
1.配置docker阿里云加速
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://96x7opee.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
2.下载须要用到的docker镜像,order
sudo docker pull registry.cn-hangzhou.aliyuncs.com/hw/consul-registrator:1.0.0 sudo docker pull registry.cn-hangzhou.aliyuncs.com/hw/consul-server:1.0.0 sudo docker pull registry.cn-hangzhou.aliyuncs.com/hw/order:1.0.0
3.启动consul-server
docker run -d -p 8400:8400 -p 8500:8500 -p 8600:53/udp --name consul-server-node1 registry.cn-hangzhou.aliyuncs.com/hw/consul-server:1.0.0 -bootstrap -advertise 192.168.10.224
4.启动consul-registrator
docker run -d --name=consul-registrator-node1 --net=host --volume=/var/run/docker.sock:/tmp/docker.sock registry.cn-hangzhou.aliyuncs.com/hw/consul-registrator:1.0.0 consul://0.0.0.0:8500
5.部署一个order镜像
docker run -d -p 8088:80 --name order1 order
6.配置模板,启动consul-template
events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; {{range services}} {{$name := .Name}} {{$service := service .Name}} upstream {{$name}} { {{range $service}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1; {{else}}server 127.0.0.1:65535; # force a 502{{end}} } {{end}} server { listen 80 default_server; location / { root /usr/share/nginx/html/; index index.html; } location /stub_status { stub_status; } {{range services}} {{$name := .Name}} location /{{$name}}/ { proxy_pass http://{{$name}}/; } {{end}} } }
F:\nginx-1.8.0\consul-template.exe -consul-addr 192.168.10.224:8500 -template F:\nginx-1.8.0\conf\nginx-template.conf:F:\nginx-1.8.0\conf\nginx.conf:"nginx -s reload -p F:\\nginx-1.8.0"
注意后面的nginx -s reload -p F:\\nginx-1.8.0要在-p后面加上nginx目录位置不然会报日志目录没法找到的错误。
这里-consul-addr是刚才咱们启动的consul-server的地址和端口,咱们用网页能够打开有一个简单的界面。-template中冒号前面填写咱们的模板路径,后面填写输出的位置。
7.启动nginx
启动前先测试一下配置文件是否正确。注意先cd到nginx的目录,不然就须要带参数去运行,具体可参见官网的文档。
F:\nginx-1.8.0>nginx.exe -t
在验证没有问题后,就能够启动了。由于我配置是监听80端口,因此我先把IIS停掉了,否则这里会出错。
F:\nginx-1.8.0>start nginx.exe
至此,全部配置就已经完成。咱们在浏览器中输入http://192.168.10.103/order/api/values 来查看一下是否能顺利访问。
OK,这表示整个流程已经走通。咱们来验证一下,是否能在docker启动新实例时自动注册到咱们的nginx配置中。
首先咱们在虚拟机terminal中输入 docker stop order1
在主机中浏览一下http://192.168.10.224:8500/ui咱们的consul服务有没有将order移除
能够看到这个时候,order1是没有的,咱们查看ngingx.conf能看到order也是被移除掉的。
浏览器访问http://192.168.10.103/order/api/values,也发现不能访问。
咱们回来虚拟机上,在terminal里输入docker start order1,
再查看http://192.168.10.224:8500/ui,发现服务已经注册了order,咱们在浏览器访问http://192.168.10.103/order/api/values,发现又能正常访问,nginx.conf配置中也从新把order节点加上。
本文原创,转载请注明出处。