docker addresss:https://hub.docker.com/_/consul
官网(查看各个参数内容):https://developer.hashicorp.com/consul/docs/agent/config/cli-flags
在Shell中执行命令拉取最新版本的Consul镜像:
docker pull consul
然后就可以启动集群了,这里启动4个Consul Agent,3个Server(会选举出一个leader),1个Client。
启动第1个Server节点,集群要求要有3个Server,将容器8500端口映射到主机8500端口,同时开启管理界面
docker run -d --name=consul_header -p 8500:8500 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --bootstrap-expect=3 --client=0.0.0.0 -ui
参数解释
`-e CONSUL_BIND_INTERFACE=eth0` 是一个用于设置环境变量的参数,它被传递给 Consul 容器。这个参数的作用是告诉 Consul 在哪个网络接口上监听来自其他节点的请求。
`-e` 代表环境变量
`CONSUL_BIND_INTERFACE` 环境变量用于指定 Consul 绑定的网络接口。如果您不指定这个环境变量,Consul 将默认使用 `127.0.0.1` 地址,这意味着只能从本地访问 Consul API。如果您希望其他节点能够访问 Consul API,您需要设置 `CONSUL_BIND_INTERFACE` 环境变量。
在这个例子中,`-e CONSUL_BIND_INTERFACE=eth0` 指定 Consul 在 `eth0` 网络接口上监听来自其他节点的请求。这意味着其他节点可以使用 `eth0` 网络接口的 IP 地址来访问 Consul API。如果您的服务器有多个网络接口,您可以根据需要设置 `CONSUL_BIND_INTERFACE` 环境变量,以便 Consul 绑定正确的网络接口。
总之,`-e CONSUL_BIND_INTERFACE=eth0` 参数的作用是告诉 Consul 在哪个网络接口上监听来自其他节点的请求。它是 Consul 容器的一个重要参数,确保 Consul 能够正确地与其他节点通信。
启动第2个Server节点,并加入集群
docker run -d --name=consul2 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.2
启动第3个Server节点,并加入集群
docker run -d --name=consul3 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=true --client=0.0.0.0 --join 172.17.0.2
启动第4个Client节点,并加入集群
docker run -d --name=consul4 -e CONSUL_BIND_INTERFACE=eth0 consul agent --server=false --client=0.0.0.0 --join 172.17.0.2
第1个启动容器的IP一般是172.17.0.2,后边启动的几个容器IP会排着来:172.17.0.3、172.17.0.4、172.17.0.5。
这些Consul节点在Docker的容器内是互通的,他们通过桥接的模式通信。但是如果主机要访问容器内的网络,需要做端口映射。在启动第一个容器时,将Consul的8500端口映射到了主机的8900端口,这样就可以方便的通过主机的浏览器查看集群信息。
进入容器consul1:
docker exec -it consul1 /bin/sh
执行ls后可以看到consul就在根目录
ls
输入exit可以跳出容器。
解决 docker 启动 consul ip 变化的问题
如果您使用 Docker 启动 Consul 容器,容器的 IP 地址可能会发生变化,这会影响 Consul 节点加入集群的功能。为了解决这个问题,您可以使用 Consul 的自动发现功能来让节点自动加入集群。
实现自动发现的步骤如下:
创建一个 Consul 集群,其中包含至少一个运行中的 Consul 节点。
在您的 Docker Compose 文件中,使用 Consul 的服务发现功能来查找运行中的节点的 IP 地址。您可以使用环境变量、DNS 或 HTTP API 来自动获取节点的 IP 地址。例如,使用环境变量:
services:
consul:
image: consul
environment:
- "CONSUL_BIND_INTERFACE=eth0"
- "CONSUL_CLIENT_INTERFACE=eth0"
- "CONSUL_SERVER=true"
- "CONSUL_RETRY_JOIN={{range service \"consul\"}}{{.Address}}{{end}}"
在这个例子中,CONSUL_RETRY_JOIN
变量使用 Consul 的服务发现功能来查找运行中的 Consul 节点的 IP 地址。这些节点的 IP 地址将被用于加入 Consul 集群。
- 启动 Docker 容器。在容器启动时,它将自动加入到 Consul 集群中,并与其他节点进行通信和同步数据。
通过这种方式,您可以让 Docker 容器自动加入 Consul 集群,而不需要手动配置 IP 地址。
具体来说,{{range service "consul"}}{{.Address}}{{end}}
是一个 Consul 模板,它将返回所有注册了服务名为 "consul" 的节点的 IP 地址。这个模板的工作原理如下:
{{range service "consul"}}
:这个指令表示使用 Consul 的服务发现功能来查找服务名为 "consul" 的所有服务实例。这个指令会迭代所有符合条件的服务实例,对每个实例执行下面的操作。{{.Address}}
:这个指令表示获取当前服务实例的 IP 地址。每个服务实例都有一个唯一的 IP 地址,它可以用来访问该实例。{{end}}
:这个指令表示结束迭代。
因此,{{range service "consul"}}{{.Address}}{{end}}
将返回一个逗号分隔的 IP 地址列表,这些 IP 地址是所有运行中的 Consul 节点的 IP 地址。当 Consul 容器启动时,它会使用这个 IP 地址列表来尝试加入 Consul 集群。如果某个节点无法连接,它会尝试连接下一个节点,直到连接成功或者尝试了所有节点。
这样,使用 CONSUL_RETRY_JOIN
环境变量设置 Consul 模板,可以让 Consul 容器自动发现集群中的其他节点,并自动加入集群。