docker consul 集群部署
本文档演示的在一台服务器上部署节点=3的consul集群
准备
1.在宿主机上分别建立目录 server1
、server2
、server3
文件夹,并对应创建config
、data
、log
文件夹
其中:
config
:配置文件路径。也是docker启动时读取的配置文件路径data
:数据存储路径。docker启动时挂载到容器中的指定路径log
:日志输出路径。(可以不落盘日志,本文档演示的是落盘日志)
单点部署
server1
1.进入到 config
目录下
1 | cd server1/config |
2.创建 config.json
配置文件
1 | vim config.json |
1 | { |
参数说明:
datacenter
:指定consul的数据中心名称bootstrap_expect
:指定启动时需要的最少节点数data_dir
:指定consul在运行过程中存储数据的目录路径(容器内路径)log_file
:指定consul输出的日志路径(容器内路径)log_level
:指定consul日志输出的等级node_name
:指定consul的节点名称client_addr
:指定consul客户端访问地址server
:指定是否是server节点ui
:指定是否启用consul的web管理界面enable_script_checks
:指定是否启用支持脚本检查(Script Checks)功能。脚本检查允许用户通过自定义的脚本来检查服务的健康状态。addresses
:指定Consul agent监听的IP地址
log_file
: 也可以是 “/consul/log/” //根据版本来的,consul容器内本身是没有log文件夹的,如果没有权限在容器内创建log文件夹,则使用 /consul/log
3.配置启动命令
在server1
目录下 创建启动脚本run.sh
1 | vim run.sh |
1 | !/bin/bash |
参数说明
-
-d
:在后台运行容器。 -
-p 8500:8500
:指定容器内端口和宿主机端口的映射关系,将容器内的8500端口映射到宿主机的8500端口上。 -
--name=consul_server_1
:指定容器名称为consul_server_1。 -
-v $PWD/data:/consul/data
:挂载宿主机上的数据存储目录到容器中的/consul/data
目录 -
-v $PWD/config:/consul/config
:挂载宿主机上的配置文件目录到容器中的/consul/config
目录 -
-v $PWD/log:/consul/log
:挂载宿主机上的日志输出目录到容器中的/consul/log
目录 -
-e CONSUL_BIND_INTERFACE='eth0'
:通过环境变量CONSUL_BIND_INTERFACE
指定Consul绑定的网卡接口为eth0 -
consul agent
:启动consul agent -
-config-dir=/consul/config/config.json
:指定配置文件路径(容器内),consul会自动读取配置文件中的参数
4.启动服务
1 | sh run.sh |
5.通过网页打开http://127.0.0.1:8500/ui看是否能看到consul看板
加入ACL认证
1.使用linux的命令生成一个64位的UUID作为master token
1 | uuidgen |
2.编写acl.hcl文件
1 | vim config/acl.hcl |
1 | acl { |
3.重启服务
1 | docker restart consul_server_1 |
4.访问UI,提示需要输入token,输入上面配置的master token即可
集群部署
一台服务器部署
在一台服务器上部署consul集群,docker run命令可以使用-p 和 -e CONSUL_BIND_INTERFACE=‘eth0’ 的方式。因为在同一台服务器上,容器网卡是eth0。
server1
1.进入到 config
目录下
1 | cd server1/config |
2.创建 config.json
配置文件
1 | vim config.json |
1 | { |
参数说明:
datacenter
:指定consul的数据中心名称bootstrap_expect
:指定启动时需要的最少节点数data_dir
:指定consul在运行过程中存储数据的目录路径(容器内路径)log_file
:指定consul输出的日志路径(容器内路径)log_level
:指定consul日志输出的等级node_name
:指定consul的节点名称client_addr
:指定consul客户端访问地址server
:指定是否是server节点ui
:指定是否启用consul的web管理界面enable_script_checks
:指定是否启用支持脚本检查(Script Checks)功能。脚本检查允许用户通过自定义的脚本来检查服务的健康状态。addresses
:指定Consul agent监听的IP地址
log_file
: 也可以是 “/consul/log/” //根据版本来的,consul容器内本身是没有log文件夹的,如果没有权限在容器内创建log文件夹,则使用 /consul/log
3.配置启动命令
在server1
目录下 创建启动脚本run.sh
1 | vim run.sh |
1 | !/bin/bash |
参数说明
-
-d
:在后台运行容器。 -
-p 8500:8500
:指定容器内端口和宿主机端口的映射关系,将容器内的8500端口映射到宿主机的8500端口上。 -
--name=consul_server_1
:指定容器名称为consul_server_1。 -
-v $PWD/data:/consul/data
:挂载宿主机上的数据存储目录到容器中的/consul/data
目录 -
-v $PWD/config:/consul/config
:挂载宿主机上的配置文件目录到容器中的/consul/config
目录 -
-v $PWD/log:/consul/log
:挂载宿主机上的日志输出目录到容器中的/consul/log
目录 -
-e CONSUL_BIND_INTERFACE='eth0'
:通过环境变量CONSUL_BIND_INTERFACE
指定Consul绑定的网卡接口为eth0 -
consul agent
:启动consul agent -
-config-dir=/consul/config/config.json
:指定配置文件路径(容器内),consul会自动读取配置文件中的参数
4.启动服务
1 | sh run.sh |
启动后,因为配置了bootstrap_expect=3,但只启动了一个server,所以会报错:没有集群领导者
需要把另外2个服务也启动起来!
server2
1.进入到 config
目录下
1 | cd server2/config |
2.创建 config.json
配置文件
1 | vim config.json |
1 | { |
3.配置启动令
在server2
目录下 创建启动脚本run.sh
1 | vim run.sh |
1 | !/bin/bash |
4.启动服务
1 | sh run.sh |
5.加入集群
1 | docker exec -it consul_server_3 consul join {consul_server_1.IP} |
server3
1.进入到 config
目录下
1 | cd server3/config |
2.创建 config.json
配置文件
1 | vim config.json |
1 | { |
3.配置启动命令
在server3
目录下 创建启动脚本run.sh
1 | mkdir run.sh |
1 | !/bin/bash |
4.启动服务
1 | sh run.sh |
5.加入集群
1 | docker exec -it consul_server_3 consul join {consul_server_1.IP} |
加入ACL认证
1.生成UUID
1 | uuidgen |
2.分别在consul_server_1
、consul_server_2
、consul_server_3
的config
文件夹中新增acl.hcl
配置文件
1 | vim config/acl.hcl |
1 | primary_datacenter = "dc1" |
参数说明:
enabled = true
:代表开启ACLdefault_policy=“deny”
:默认为allow,如果需要自定义权限,需要将其设置为denyenable_token_persistence =true
: 开启token持久化,将token持久化到磁盘上
3.重启 consul_server_1
、 consul_server_2
、consul_server_3
服务
1 | docker restart consul_server_1 |
5.启动UI界面查看,登录需要secreatID
验证,即输入acl.hcl
配置文件中的master
token
多台服务器部署
目前查找到能部署成功的方式是通过network的方式。
server1
服务器IP:192.168.26.73
1.进入到 config
目录下
1 | cd server1/config |
2.创建 config.json
配置文件
1 | vim config.json |
![image-20240226151703284](/imgs/2.png
1 | { |
log_file
: 也可以是 “/consul/log/” //根据版本来的,consul容器内本身是没有log文件夹的,如果没有权限在容器内创建log文件夹,则使用 /consul/log
3.配置启动命令
在server1
目录下 创建启动脚本run.sh
1 | vim run.sh |
1 | !/bin/bash |
参数说明
-d
:在后台运行容器。--network=host
:将容器连接到名为host的网络--name=consul_server_1
:指定容器名称为consul_server_1。-v $PWD/data:/consul/data
:挂载宿主机上的数据存储目录到容器中的/consul/data
目录-v $PWD/config:/consul/config
:挂载宿主机上的配置文件目录到容器中的/consul/config
目录-v $PWD/log:/consul/log
:挂载宿主机上的日志输出目录到容器中的/consul/log
目录-e CONSUL_BIND_INTERFACE='ens192'
:通过环境变量CONSUL_BIND_INTERFACE
指定Consul绑定的网卡接口为ens192
(这个根据实际的网卡名称,通过ifconfig
命令查看)consul agent
:启动consul agent-bind=192.168.26.73
:指定Consul节点在Docker容器内监听的IP地址(服务器IP)-config-dir=/consul/config/config.json
:指定配置文件路径(容器内),consul会自动读取配置文件中的参数
4.启动服务
1 | sh run.sh |
启动后,因为配置了bootstrap_expect=3,但只启动了一个server,所以会报错:没有集群领导者
需要把另外2个服务也启动起来!
server2
服务器IP:192.168.26.74
1.进入到 config
目录下
1 | cd server2/config |
2.创建 config.json
配置文件
1 | vim config.json |
1 | { |
3.配置启动命令
在server2
目录下 创建启动脚本run.sh
1 | vim run.sh |
1 | !/bin/bash |
参数说明
-join=192.168.26.73
:将节点加入到consul_server_1
IP上
4.启动服务
1 | sh run.sh |
server3
服务器IP:192.168.26.75
1.进入到 config
目录下
1 | cd server3/config |
2.创建 config.json
配置文件
1 | vim config.json |
1 | { |
3.配置启动命令
在server3
目录下 创建启动脚本run.sh
1 | vim run.sh |
1 | !/bin/bash |
参数说明
-join=192.168.26.73
:将节点加入到consul_server_1
IP上
4.启动服务
1 | sh run.sh |
节点自动加入集群
1.分别编辑sverer1
、sverer2
、sverer3
的配置文件,加入start_join
和 retry_join
字段
1 | vim config/config.json |
server2
和 server3
同样配置。
2.重新加载配置文件,验证配置是否正确
1 | docker exec consul_server_1 consul reload |
我测试的consul_server_2
是 leader
,加入了配置,但是没有重启leader
。我重启的是 consul_server_1
,测试优雅退出 consul_server_1
,然后再重启,发现自动加入到了节点;也测试 consul_server_3
不加配置,然后优雅退出 consul_server_3
再重启,发现 consul_server_3
也自动加入到了节点。(这是为什么呢,从测试的结果来看,只要一个节点加入配置即可)
加入ACL认证
方法一:配置acl.hcl
,通过consul acl bootstrap 生成token,然后把生成的token当做 master
的token。
本文档不采用该方法,有兴趣的可以自行去了解。参考文档 中【增加ACL token权限配置】目录。
方法二:使用linux的 uuidgen
命令生成一个64位UUID作为 master
token,写入acl.hcl
配置文件中
1.生成UUID
1 | uuidgen |
output:
1 | 17b0d7f6-cd24-4989-ad84-9e1e5c938ce8 |
2.分别在consul_server_1
、 consul_server_2
、consul_server_3
的 config
文件夹中 新增acl.hcl
配置文件,并将生成的token 加入文件中
1 | vim config/acl.hcl |
1 | primary_datacenter = "dc1" |
参数说明:
enabled = true
:代表开启ACLdefault_policy=“deny”
:默认为allow,如果需要自定义权限,需要将其设置为denyenable_token_persistence =true
: 开启token持久化,将token持久化到磁盘上
3.重启 consul_server_1
、 consul_server_2
、consul_server_3
服务
1 | docker restart consul_server_1 |
4.启动UI界面查看
输入 acl.hcl
配置文件中的 master
的 token