docker consul

2023-04-03  本文已影响0人  哆啦在这A梦在哪

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端口,这样就可以方便的通过主机的浏览器查看集群信息。

image

进入容器consul1:

docker exec -it consul1 /bin/sh

执行ls后可以看到consul就在根目录

ls

输入exit可以跳出容器。

解决 docker 启动 consul ip 变化的问题

如果您使用 Docker 启动 Consul 容器,容器的 IP 地址可能会发生变化,这会影响 Consul 节点加入集群的功能。为了解决这个问题,您可以使用 Consul 的自动发现功能来让节点自动加入集群。

实现自动发现的步骤如下:

  1. 创建一个 Consul 集群,其中包含至少一个运行中的 Consul 节点。

  2. 在您的 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 集群。

  1. 启动 Docker 容器。在容器启动时,它将自动加入到 Consul 集群中,并与其他节点进行通信和同步数据。

通过这种方式,您可以让 Docker 容器自动加入 Consul 集群,而不需要手动配置 IP 地址。
具体来说,{{range service "consul"}}{{.Address}}{{end}} 是一个 Consul 模板,它将返回所有注册了服务名为 "consul" 的节点的 IP 地址。这个模板的工作原理如下:

因此,{{range service "consul"}}{{.Address}}{{end}} 将返回一个逗号分隔的 IP 地址列表,这些 IP 地址是所有运行中的 Consul 节点的 IP 地址。当 Consul 容器启动时,它会使用这个 IP 地址列表来尝试加入 Consul 集群。如果某个节点无法连接,它会尝试连接下一个节点,直到连接成功或者尝试了所有节点。

这样,使用 CONSUL_RETRY_JOIN 环境变量设置 Consul 模板,可以让 Consul 容器自动发现集群中的其他节点,并自动加入集群。

上一篇 下一篇

猜你喜欢

热点阅读