目录
2.1 安装 docker-ce,docker-compose
3.3 验证 http 和 nginx 服务是否注册到 consul
服务注册与发现是微服务架构中不可或缺的重要功能。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构,起初的解决手段是在服务前端负载均衡,这样前端必须要知道所有后端服务的网络位置,并配置在配置文件中
consul 是 google 开源的一个使用 go 语言开发的服务管理软件。支持多数据中心、分布式高可用的、服务发现和配置共享。采用 Raft 算法,用来保证服务的高可用。内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其他工具(比如 ZooKeeper 等)。服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行 agent,他有两种运行模式 server 和 client。 每个数据中心官方建议需要 3 或 5 个 server 节点以保证数据安全,同时保证 server-leader 的选举能够正确的进行。

| 服务器 | IP地址 | 主机名 | 主要功能 |
| consul服务器 | 192.168.223.53 | consul | docker-ce,docker-compose,consul,nginx,consul-template |
| registrator 服务器 | 192.168.223.37 | registrator | docker-ce,registrator,nginx |
- #两个节点
- systemctl disable --now firewalld.service
- setenforce 0
-
- #consul 服务器
- hostnamectl set-hostname consul
- su
-
- #registrator 服务器
- hostnamectl set-hostname registrator
- su
- [root@consul ~]#curl -SsL http://101.34.22.188/shells/docker.sh > docker.sh
- [root@consul ~]#bash docker.sh &> /dev/null
- [root@consul ~]#systemctl status docker | grep Active
- Active: active (running) since 一 2021-12-06 12:15:52 CST; 15s ago
- [root@consul ~]#wget http://101.34.22.188/docker-compose/docker-compose -P /usr/local/bin/ &> /dev/null
- [root@consul ~]#chmod +x /usr/local/bin/docker-compose
- [root@consul ~]#docker-compose -v
- docker-compose version 1.21.1, build 5a3f1a3
- [root@consul ~]#mkdir /opt/consul
- [root@consul ~]#cd /opt/consul/
- [root@consul /opt/consul]#wget http://101.34.22.188/consul/consul_0.9.2_linux_amd64.zip &> /dev/null
- [root@consul /opt/consul]#unzip consul_0.9.2_linux_amd64.zip &> /dev/null
- [root@consul /opt/consul]#mv consul /usr/local/bin/
设置代理,在后台启动 consul 服务端
- [root@consul /opt/consul]#consul agent \
- -server \
- -bootstrap \
- -ui \
- -data-dir=/var/lib/consul-data \
- -bind=192.168.223.53 \
- -client=0.0.0.0 \
- -node=consul-server01 &> /var/log/consul.log &
- [root@consul /opt/consul]#netstat -natp | grep consul
- tcp 0 0 192.168.10.20:8300 0.0.0.0:* LISTEN 60857/consul
- tcp 0 0 192.168.10.20:8301 0.0.0.0:* LISTEN 60857/consul
- tcp 0 0 192.168.10.20:8302 0.0.0.0:* LISTEN 60857/consul
- tcp6 0 0 :::8600 :::* LISTEN 60857/consul
- tcp6 0 0 :::8500 :::* LISTEN 60857/consul
监听端口
启动 consul 后默认会监听 5 个端口:
查看 members 状态
- [root@consul /opt/consul]#consul members
- Node Address Status Type Build Protocol DC
- consul-server01 192.168.223.53:8301 alive server 0.9.2 2 dc1
查看群集状态
- [root@consul /opt/consul]#consul operator raft list-peers
- Node ID Address State Voter RaftProtocol
- consul-server01 192.168.223.53:8300 192.168.223.53:8300 leader true 2
- [root@consul /opt/consul]#curl 127.0.0.1:8500/v1/status/peers
- ["192.168.223.53:8300"]
- [root@consul /opt/consul]#curl 127.0.0.1:8500/v1/status/leader
- "192.168.223.53:8300"
- [root@consul /opt/consul]#curl 127.0.0.1:8500/v1/catalog/services
- {"consul":[]}
- [root@consul /opt/consul]#curl 127.0.0.1:8500/v1/catalog/nginx
- [root@consul /opt/consul]#curl 127.0.0.1:8500/v1/catalog/nodes
- [{"ID":"6eac3213-77b3-d578-ab2b-4c4c642e080b","Node":"consul-server01","Address":"192.168.223.53","Datacenter":"dc1","TaggedAddresses":{"lan":"192.168.223.53","wan":"192.168.223.53"},"Meta":{},"CreateIndex":5,"ModifyIndex":6}]
- curl 127.0.0.1:8500/v1/status/peers #查看集群 server 成员
- curl 127.0.0.1:8500/v1/status/leader #集群 server-leader
- curl 127.0.0.1:8500/v1/catalog/services #注册的所有服务
- curl 127.0.0.1:8500/v1/catalog/nginx #查看 nginx 服务信息
- curl 127.0.0.1:8500/v1/catalog/nodes #集群节点详细信息
Gliderlabs/Registrator 可检查容器运行状态自动注册,还可注销 docker 容器的服务到服务配置中心。目前支持 Consul、Etcd 和 SkyDNS2。
- [root@registrator ~]#docker run -d \
- --name=registrator \
- --net=host \
- -v /var/run/docker.sock:/tmp/docker.sock \
- --restart=always \
- gliderlabs/registrator:latest \
- --ip=192.168.223.37 \
- consul://192.168.223.53:8500
- ......
- [root@registrator ~]#docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- gliderlabs/registrator latest 3b59190c6c80 5 years ago 23.8MB
- [root@registrator ~]#docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- c3f22213e1df gliderlabs/registrator:latest "/bin/registrator --…" 19 seconds ago Up 19 seconds registrator
参数说明
- [root@registrator ~]#docker run -itd -p 81:80 --name test1 nginx
- ......
- ae534c6e3b21c5eb69347883dd2293fe4bb890ab94311e97b2b28f69a0638d3b
- [root@registrator ~]#docker run -itd -p 82:80 --name test2 nginx
- fd51252a6d2b5f835608da3e54ee299e930773094aba41ba5877e182119d7823
- [root@registrator ~]#docker run -itd -p 83:80 --name test3 httpd
- ......
- 2c6c64190ec77384a7ee5e0887f2debbd56fa990b814a706137ecca4ba0f5688
- [root@registrator ~]#docker run -itd -p 84:80 --name test4 httpd
- 78c024e77c5cc65bf5c227a1fbbdb59b242dcd823e52b2ada3c2c0849454a995
- [root@registrator ~]#docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 78c024e77c5c httpd "httpd-foreground" 3 seconds ago Up 2 seconds 0.0.0.0:84->80/tcp, :::84->80/tcp test4
- 2c6c64190ec7 httpd "httpd-foreground" 8 seconds ago Up 7 seconds 0.0.0.0:83->80/tcp, :::83->80/tcp test3
- fd51252a6d2b nginx "/docker-entrypoint.…" 35 seconds ago Up 34 seconds 0.0.0.0:82->80/tcp, :::82->80/tcp test2
- ae534c6e3b21 nginx "/docker-entrypoint.…" 43 seconds ago Up 42 seconds 0.0.0.0:81->80/tcp, :::81->80/tcp test1
- c3f22213e1df gliderlabs/registrator:latest "/bin/registrator --…" 4 minutes ago Up 4 minutes registrator
浏览器中输入 http://192.168.223.53:8500,在 Web 页面中单击 NODES,然后单击 consul-server01,会出现 5 个服务。

在 consul 服务器使用 curl 测试连接服务器
- [root@consul /opt/consul]#curl 127.0.0.1:8500/v1/catalog/services
- {"consul":[],"httpd":[],"nginx":[]}
Consul-Template 是基于 Consul 的自动替换配置文件的应用。Consul-Template 是一个守护进程,用于实时查询 Consul 集群信息,并更新文件系统上任意数量的指定模板,生成配置文件。更新完成以后,可以选择运行 shell 命令执行更新操作,重新加载 Nginx。
onsul-Template 可以查询 Consul 中的服务目录、Key、Key-values 等。这种强大的抽象功能和查询语言模板可以使 Consul-Template 特别适合动态的创建配置文件。
例如:创建 Apache/Nginx Proxy Balancers、Haproxy Backends 等
- [root@consul ~]#cat > /opt/consul/nginx.ctmpl << EOF
- #定义 nginx upstream 一个简单模板
- upstream http_backend {
- {{range service "nginx"}}
- server {{.Address}}:{{.Port}};
- {{end}}
- }
- #定义一个 server,监听 8000 端口,反向代理到 upstream
- server {
- listen 8000;
- server_name localhost 192.168.223.53;
- #修改日志路径
- access_log /var/log/nginx/test.com-access.log;
- index index.html index.php;
- location / {
- proxy_set_header HOST $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header Client-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_pass http://http_backend;
- }
- }
- EOF
编译安装
- [root@consul ~]#yum -y install pcre-devel zlib-devel gcc gcc-c++ make &> /dev/null
- [root@consul ~]#useradd -M -s /sbin/nologin nginx
- [root@consul ~]#wget http://101.34.22.188/lnmp_wordpress/nginx-1.12.0.tar.gz -P /opt &> /dev/null
- [root@consul ~]#tar xf /opt/nginx-1.12.0.tar.gz -C /opt/
- [root@consul ~]#cd /opt/nginx-1.12.0/
- [root@consul /opt/nginx-1.12.0]#./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make -j 4 && make install
- ......
- [root@consul /opt/nginx-1.12.0]#ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
启动
- [root@consul /opt/nginx-1.12.0]#vim /usr/local/nginx/conf/nginx.conf
- ······
- http {
- include mime.types;
- include vhost/*.conf; #添加虚拟主机目录
- default_type application/octet-stream;
- ······
-
- #创建虚拟主机
- [root@consul /opt/nginx-1.12.0]#mkdir /usr/local/nginx/conf/vhost
- #创建日志文件目录
- [root@consul /opt/nginx-1.12.0]#mkdir /var/log/nginx
- [root@consul /opt/nginx-1.12.0]#nginx
- [root@consul /opt/nginx-1.12.0]#netstat -natp | grep nginx
- tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 63708/nginx: master
- [root@consul ~]#cd /opt/
- [root@consul /opt]#wget http://101.34.22.188/consul/consul-template_0.19.3_linux_amd64.zip &> /dev/null
- [root@consul /opt]#unzip consul-template_0.19.3_linux_amd64.zip -d /opt/ &> /dev/null
- [root@consul /opt]#mv consul-template /usr/local/bin/
在前台启动 template 服务,启动后不要按 ctrl+c 中止 consul-template 进程
- [root@consul /opt]# consul-template --consul-addr 192.168.223.53:8500 \
- --template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/test.conf:/usr/local/nginx/sbin/nginx -s reload" \
- --log-level=info
- ······
另外打开一个终端查看生成配置文件
- [root@consul ~]#cd /usr/local/nginx/conf/vhost/
- [root@consul /usr/local/nginx/conf/vhost]#ls
- test.conf
- [root@consul /usr/local/nginx/conf/vhost]#cat test.conf
- #定义 nginx upstream 一个简单模板
- upstream http_backend {
-
- server 192.168.223.37:81;
-
- server 192.168.223.37:82;
-
- }
- #定义一个 server,监听 8000 端口,反向代理到 upstream
- server {
- listen 8000;
- server_name localhost 192.168.223.53;
- #修改日志路径
- access_log /var/log/nginx/test.com-access.log;
- index index.html index.php;
- location / {
- proxy_set_header HOST $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header Client-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_pass http://http_backend;
- }
- }
准备访问页面(registrator 服务器)
- [root@registrator ~]#docker exec -it test1 bash
- root@ae534c6e3b21:/# echo "this is test1 web" > /usr/share/nginx/html/index.html
- root@ae534c6e3b21:/# exit
- exit
- [root@registrator ~]#docker exec -it test2 bash
- root@fd51252a6d2b:/# echo "this is test2 web" > /usr/share/nginx/html/index.html
- root@fd51252a6d2b:/# exit
- exit
浏览器访问 http://192.168.223.53:8000/ 并不断刷新即可查看
rr 轮询,权重为 1
增加一个 nginx 容器(registrator 节点)
- [root@registrator ~]#docker run -itd -p 85:80 --name test5 -h test5 nginx
- 78e0b2de66c22461870f1982dbaab3c3c3461b53640b7ce36a769c9332bc2b23
- [root@registrator ~]#docker ps -a | grep test5
- 78e0b2de66c2 nginx "/docker-entrypoint.…" 11 seconds ago Up 10 seconds 0.0.0.0:85->80/tcp, :::85->80/tcp test5
观察 template 服务,会从模板更新 /usr/local/nginx/conf/vhost/test.conf 文件内容,并且重载 nginx 服务(consul 节点)
- [root@consul ~]#cat /usr/local/nginx/conf/vhost/test.conf
- #定义 nginx upstream 一个简单模板
- upstream http_backend {
-
- server 192.168.223.37:81;
-
- server 192.168.223.37:82;
-
- server 192.168.223.37:85; #新加的服务
-
- }
- #定义一个 server,监听 8000 端口,反向代理到 upstream
- server {
- listen 8000;
- server_name localhost 192.168.223.53;
- #修改日志路径
- access_log /var/log/nginx/test.com-access.log;
- index index.html index.php;
- location / {
- proxy_set_header HOST $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header Client-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_pass http://http_backend;
- }
- }
添加一台已有 docker 环境的服务器 192.168.223.50/24 加入已有的群集中
- [18:33:32 root@docker_test~]#wget http://101.34.22.188/docker-compose/docker-compose -P /usr/local/bin/ &> /dev/null
- [18:38:22 root@docker_test~]#chmod +x /usr/local/bin/docker-compose
- [18:38:27 root@docker_test~]#docker-compose -v
- docker-compose version 1.21.1, build 5a3f1a3
- [18:38:33 root@docker_test~]#mkdir /opt/consul
- [18:38:39 root@docker_test~]#cd /opt/consul/
- [18:38:44 root@docker_testconsul]#wget http://101.34.22.188/consul/consul_0.9.2_linux_amd64.zip &> /dev/null
- [18:38:59 root@docker_testconsul]#unzip consul_0.9.2_linux_amd64.zip &> /dev/null
- [18:39:05 root@docker_testconsul]#mv consul /usr/local/bin/
- [18:39:10 root@docker_testconsul]#consul agent \
- > -server \
- > -ui \
- > -data-dir=/var/lib/consul-data \
- > -bind=192.168.223.50 \
- > -client=0.0.0.0 \
- > -node=consul-server02 \
- > -enable-script-checks=true \
- > -datacenter=dc1 \
- > -join 192.168.223.53 &> /var/log/consul.log &
- [1] 32276
-enable-script-checks=true :设置检查服务为可用
-datacenter : 数据中心名称
-join :加入到已有的集群中
- [18:39:43 root@docker_testconsul]#consul members
- Node Address Status Type Build Protocol DC
- consul-server01 192.168.223.53:8301 alive server 0.9.2 2 dc1
- consul-server02 192.168.223.50:8301 alive server 0.9.2 2 dc1
- [18:39:50 root@docker_testconsul]#consul operator raft list-peers
- Node ID Address State Voter RaftProtocol
- consul-server01 192.168.223.53:8300 192.168.223.53:8300 leader true 2
- consul-server02 192.168.223.50:8300 192.168.223.50:8300 follower true 2