Docker搭建Consul集群
下载镜像
sh
# 下载镜像
docker pull consul:1.8.3Docker-Compo启动
yml
# 启动方式 docker-compose -f docker-compose-consul-cluster.yml up -d
version: '3'
services:
consul-server1:
image: consul:1.8.3
restart: always
hostname: "consul-server1"
ports:
- "8501:8500"
- "53"
volumes:
- /server/consul-cluster/server1/data:/consul/data
command: "agent -server -bootstrap-expect 3 -ui -disable-host-node-id -client 0.0.0.0"
consul-server2:
image: consul:1.8.3
restart: always
hostname: "consul-server2"
ports:
- "8502:8500"
- "53"
volumes:
- /server/consul-cluster/server2/data:/consul/data
command: "agent -server -ui -join consul-server1 -disable-host-node-id -client 0.0.0.0"
depends_on:
- consul-server1
consul-server3:
image: consul:1.8.3
restart: always
hostname: "consul-server3"
ports:
- "8503:8500"
- "53"
volumes:
- /server/consul-cluster/server3/data:/consul/data
command: "agent -server -ui -join consul-server1 -disable-host-node-id -client 0.0.0.0"
depends_on:
- consul-server1
consul-node1:
image: consul:1.8.3
restart: always
hostname: "consul-node1"
ports:
- "8500:8500"
- "53"
command: "agent -join consul-server1 -ui -disable-host-node-id -client 0.0.0.0"
depends_on:
- consul-server1创建相关文件夹
sh
# 创建Consul基本目录
mkdir /server/consul
创建数据文件夹
mkdir /server/consul/data
# 创建配置文件夹
mkdir /server/consul/config创建Consul Server节点
sh
docker run -d -p 8501:8500 --restart=always \
--mount type=volume,source=consul-data-1,target=/consul/data \
--mount type=volume,source=consul-conf-1,target=/consul/config \
-e CONSUL_BIND_INTERFACE='eth0' \
--name consul-server-1 consul:1.8.3 agent -server -node server-1 \
--bootstrap-expect 3 -client 0.0.0.0 -ui \
-data-dir=/consul/data -config-dir=/consul/config -datacenter=dh_dc获取consul容器地址
sh
# 获取consul容器地址
docker inspect --format '{{ .NetworkSettings.IPAddress }}' consul-server-1创建其他Consul节点并且加入集群
sh
nsul节点并且加入集群
docker run -d -p 8502:8500 --restart=always \
--mount type=volume,source=consul-data-2,target=/consul/data \
--mount type=volume,source=consul-conf-2,target=/consul/config \
-e CONSUL_BIND_INTERFACE='eth0' \
--name consul-server-2 consul:1.8.3 agent -server -node server-2 \
--bootstrap-expect 3 -client 0.0.0.0 -ui \
-data-dir=/consul/data -config-dir=/consul/config -datacenter=dh_dc -join=172.17.0.6
docker run -d -p 8503:8500 --restart=always \
--mount type=volume,source=consul-data-3,target=/consul/data \
--mount type=volume,source=consul-conf-3,target=/consul/config \
-e CONSUL_BIND_INTERFACE='eth0' \
--name consul-server-3 consul:1.8.3 agent -server -node server-3 \
--bootstrap-expect 3 -client 0.0.0.0 -ui \
-data-dir=/consul/data -config-dir=/consul/config -datacenter=dh_dc -join=172.17.0.6创建Consul Client节点
为什么要有这个客户端
一个Client是一个转发所有RPC到server的代理,它本身不持久化这些信息。client是相对无状态的。client唯一执行的后台动作是加入LAN gossip池。client会提供最低的资源开销并且仅消耗少量的网络带宽。
sh
docker run -d -p 8500:8500 --restart=always \
--mount type=volume,source=consul-data-0,target=/consul/data \
--mount type=volume,source=consul-conf-0,target=/consul/config \
-e CONSUL_BIND_INTERFACE='eth0' --name=consul-client-0 consul:1.8.3 \
agent -node=client-1 -join=172.17.0.6 -client='0.0.0.0' -datacenter=dh_dc \
-ui -config-dir /consul/config -data-dir=/consul/data查看Consul成员信息
sh
docker exec consul-server-3 consul members命令介绍
sh
agent : 表示启动 Agent 进程。
-server:表示启动 Consul Server 模式。
-client:表示启动 Consul Cilent 模式。
-bootstrap:表示这个节点是 Server-Leader ,每个数据中心只能运行一台服务器。技术角度上讲 Leader 是通过 Raft 算法选举的,但是集群第一次启动时需要一个引导 Leader,在引导群集后,建议不要使用此标志。
-bootstrap-expect:集群期望的 Server 节点数,只有达到这个值才会选举 Leader
-ui:表示启动 Web UI 管理器
-node:节点的名称,集群中必须是唯一的。
-client:表示 Consul 将绑定客户端接口的地址,0.0.0.0 表示所有地址都可以访问。
-join:表示加入到某一个集群中去。 如:-join=192.168.1.23
-bind: 指定节点绑定的地址
-datacenter: 数据中心
-config-file: 要加载的配置文件
---
**环境变量介绍**
CONSUL_CLIENT_INTERFACE :配置 Consul 的 -client=<interface ip> 命令参数。
CONSUL_BIND_INTERFACE :配置 Consul 的 -bind=<interface ip> 命令参数。
CONSUL_DATA_DIR :配置 Consul 的数据持久化目录。
CONSUL_CONFIG_DIR:配置 Consul 的配置文件目录。端口介绍
| 端口 | 说明 |
|---|---|
| TCP/8300 | 端口用于服务器节点。客户端通过该端口 RPC 协议调用服务端节点。服务器节点之间相互调用 |
| TCP/UDP/8301 | 端口用于单个数据中心所有节点之间的互相通信,即对 LAN 池信息的同步。它使得整个数据中心能够自动发现服务器地址,分布式检测节点故障,事件广播(如领导选举事件). |
| TCP/UDP/8302 | 端口用于单个或多个数据中心之间的服务器节点的信息同步,即对 WAN 池信息的同步。它针对互联网的高延迟进行了优化,能够实现跨数据中心请求。 |
| 8500 | 端口基于 HTTP 协议,用于 API 接口或 WEB UI 访问。 |
| 8600 | 端口作为 DNS 服务器,它使得我们可以通过节点名查询节点信息。 |
端口说明
使用ACL控制权限
yml
# 配置文件
# 在Consul配置文件增加如下配置
{
"acl":{
"enabled":true,
"default_policy":"deny",
"enable_token_persistence":true,
"tokens":{
"master":"",
"anonymous":""
}
}
}Consul策略表

在UI 操作ACL,添加策略,分配角色,生成角色Token。
yml
service_prefix "" {
policy = "write"
}
key_prefix "" {
policy = "write"
}
node_prefix "" {
policy = "write"
}