美文网首页
docker consul

docker consul

作者: 哆啦在这A梦在哪 | 来源:发表于2023-04-03 17:59 被阅读0次

    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"}}:这个指令表示使用 Consul 的服务发现功能来查找服务名为 "consul" 的所有服务实例。这个指令会迭代所有符合条件的服务实例,对每个实例执行下面的操作。

    • {{.Address}}:这个指令表示获取当前服务实例的 IP 地址。每个服务实例都有一个唯一的 IP 地址,它可以用来访问该实例。

    • {{end}}:这个指令表示结束迭代。

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

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

    相关文章

      网友评论

          本文标题:docker consul

          本文链接:https://www.haomeiwen.com/subject/dpabkrtx.html