[TOC]
1 2 3 4 5 6 7 8 9 10 11 12 13 docker-machine create -d xhyve nginx docker-machine create -d xhyve consul docker-machine create -d xhyve work1 docker-machine create -d xhyve work2 docker-machine ls docker-machine ls NAME     ACTIVE   DRIVER    STATE     URL                         SWARM   DOCKER     ERRORS consul   -        xhyve     Running   tcp://192.168.64.15:2376            v19.03.5 nginx    -        xhyve     Running   tcp://192.168.64.14:2376            v19.03.5 work1    -        xhyve     Running   tcp://192.168.64.16:2376            v19.03.5 work2    -        xhyve     Running   tcp://192.168.64.17:2376            v19.03.5 
 
  
consul 进入consul机器 1 docker-machine ssh consul 
 
运行consul节点容器 1 2 3 4 5 6 7 docker run \     -d \     -v /data:/data \     -p 8500:8500 \     -p 8600:8600/udp \     --name=consul \     consul agent -server -ui -node=server1 -bootstrap-expect=1 -client=0.0.0.0 
 
查看容器启动情况 1 2 3 root@consul:/home/docker# docker container ls CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                    NAMES 2d9d0cdd3f13        consul              "docker-entrypoint.s…"   3 minutes ago       Up 3 minutes        8300-8302/tcp, 8600/tcp, 8301-8302/udp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8600->8600/udp   consul 
 
访问web页面 http://192.168.64.15:8500/ui/dc1/services 
nginx 进入nginx节点机器 1 docker-machine ssh nginx 
 
consul-template配置 安装consul-template 1 2 3 4 5 wget https://releases.hashicorp.com/consul-template/0.24.1/consul-template_0.24.1_linux_amd64.tgz  tar -zxf consul-template_0.24.1_linux_amd64.tgz mv consul-template /usr/bin/ 
 
创建nginx.ctmpl模板 1 2 3 4 5 sudo su mkdir /data/nginx vi /data/nginx/nginx.ctmpl 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 upstream  http_backend {    {{range service "nginx"}}     server {{ .Address }}:{{ .Port }};     {{ end }} } server  {    listen  8000 ;     server_name  localhost;     location  / {     proxy_pass  http://http_backend;     } } 
 
启动consul-template服务 1 consul-template --consul-addr 192.168.64.15:8500 --template "./nginx.ctmpl:vhost.conf:docker exec nginx nginx -s reload" --log-level=info 
 
–consul-addr:指定consul服务的ip和端口; ./nginx.ctmpl:这是用nginx.ctmpl这个模板来启动进程,这是写的相对路径,也可以写绝对路径; vhost.conf:nginx.ctmpl模板生成后的文件名,这也可以写绝对路径,如果不写绝对路径,这个文件就在当前目录生成(/usr/local/nginx/consul/)
 
验证consul-template服务状态 1 ps -ef | grep consul-template 
 
我们看到在本目录下生成了vhost.conf
由于我们是容器启动的nginx,所以需要挂载当前目录将这个加载在容器里面的nginx配置里面运行
 
运行nginx容器 创建nginx.conf和conf.d目录 
先运行一个nginx容器,随便挂载一个目录,拷贝出来nginx官方镜像生成的容器里面的conf.d目录和nginx.conf 
再删除这个容器,重新运行并且挂载nginx.conf和conf.d目录到新容器 
重新运行consul-template 并且重新指定vhost.conf的生成目录 
 
 
运行容器 
1 docker run --name=nginx_tmp -v /zhimma:/zhimma -d nginx 
 
进入容器并拷贝目录 
1 2 3 4 5 6 7 root@nginx:/data/nginx root@49762af8ada3:/ bin  boot  dev	etc  home  lib	lib64  media  mnt  opt	proc  root  run  sbin  srv  sys  tmp  usr  var	zhimma root@49762af8ada3:/ root@49762af8ada3:/etc/nginx root@49762af8ada3:/etc/nginx 
 
删除容器 
 
放置文件 
1 2 3 4 5 6 7 8 root@nginx:/data/nginx /data/nginx root@nginx:/data/nginx nginx.ctmpl  vhost.conf root@nginx:/data/nginx root@nginx:/data/nginx conf.d       nginx.conf   nginx.ctmpl  vhost.conf 
 
运行新容器 1 docker run --name=nginx -p 8000:8000 -p 80:80 -v /data/nginx/nginx.conf:/etc/nginx/nginx.conf -v /data/nginx/conf.d:/etc/nginx/conf.d -d nginx 
 
此步完成后可以去容器里面看看挂载是否成功
 
重新运行consul-template 1 consul-template --consul-addr 192.168.64.15:8500 --template "./nginx.ctmpl:./conf.d/vhost.conf:docker exec nginx nginx -s reload"  --log-level=info 
 
此步完成后可以去容器里面看看挂载是否成功
-template参数来指定模板的解析,规则是:冒号第一段是模板文件路径,第二段是生成的配置文件路径,第三段是额外指令(这里特别重要:如果我们没有nginx -s reload这个,配置更新之后,无法自动生效。这个代表每次配置改变之后,都会自动执行此指令,用来reload nginx的配置,以便自动生效 )
 
work1 进入work1机器 1 docker-machine ssh work1 
 
创建registrator容器 1 docker run -d --name registrator --network=host -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator:latest --ip 192.168.64.16 consul://192.168.64.15:8500 
 
创建nginx容器并修改index.html内容 1 2 3 4 5 docker run -itd --name work_81  -p 81:80 -v /data/www/81/:/usr/share/nginx/html nginx echo  "work1_81"  >> /data/www/81/index.htmldocker run -itd --name work_82  -p 82:80 -v /data/www/82/:/usr/share/nginx/html nginx echo  "work1_82"  >> /data/www/82/index.html
 
Work2 进入work2机器 1 docker-machine ssh work2 
 
创建registrator容器 1 docker run -d --name registrator --network=host -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator:latest --ip 192.168.64.17 consul://192.168.64.15:8500 
 
创建nginx容器并修改index.html内容 1 2 3 4 5 docker run -itd --name work_83  -p 83:80 -v /data/www/83/:/usr/share/nginx/html nginx echo  "work2_83"  >> /data/www/83/index.htmldocker run -itd --name work_84  -p 84:80 -v /data/www/84/:/usr/share/nginx/html nginx echo  "work2_84"  >> /data/www/84/index.html