[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![image-20210322151230731](https://zhimma.oss-cn-beijing.aliyuncs.com/md/J8i5ww.png)
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