0%

Consul初体验

[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)

image-20200203183743444

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

image-20200203185856803

我们看到在本目录下生成了vhost.conf

image-20200203190041025

由于我们是容器启动的nginx,所以需要挂载当前目录将这个加载在容器里面的nginx配置里面运行

运行nginx容器

创建nginx.conf和conf.d目录
  1. 先运行一个nginx容器,随便挂载一个目录,拷贝出来nginx官方镜像生成的容器里面的conf.d目录和nginx.conf
  2. 再删除这个容器,重新运行并且挂载nginx.conf和conf.d目录到新容器
  3. 重新运行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# docker exec -it nginx_tmp bash
root@49762af8ada3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var zhimma

root@49762af8ada3:/# cd /etc/nginx/
root@49762af8ada3:/etc/nginx# cp -r conf.d/ nginx.conf /zhimma/
root@49762af8ada3:/etc/nginx# exit

删除容器

1
docker rm -f nginx_tmp

放置文件

1
2
3
4
5
6
7
8
root@nginx:/data/nginx# pwd
/data/nginx
root@nginx:/data/nginx# ls
nginx.ctmpl vhost.conf

root@nginx:/data/nginx# mv /zhimma/conf.d/ /zhimma/nginx.conf ./
root@nginx:/data/nginx# ls
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.html

docker 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.html

docker 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