consul是微服务体系中用于服务发现的高可用工具,现在我们来使用docker先搭建一个单点consul agent,然后搭建一个三节点集群。
查看所有consul的镜像文件:
docker search consul
拉取镜像:
docker pull consul
检查拉取是否成功:
docker images
或者:
docker run consul version
启动单节点consul agent:
docker run -p 8500:8500/tcp consul agent -server -ui -bootstrap-expect=1 -client=0.0.0.0
如上的命令中,参数说明如下:
暴露了端口,分别是:HTTP端口:8500
h:对应的node1为节点的名称
server:表示启动的节点类型为server类型
bootstrap-expect:用于server节点选举leader的参数,表示达到几个server节点时开始选举
使用浏览器来进行访问(使用阿里云服务器要记得开放安全端口):
宿主机上查看节点数量:
启动第一个节点:
启动第一个节点的时候没有使用了 -bootstrap 参数, 而是使用了 -bootstrap-expect 3, 使用这个参数节点会等到所有三个端都连接到一起了才会启动并且成为一个可用的cluster。
$ docker run -d -p 8500:8500 -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_1 consul agent -server -bootstrap -ui -node=1 -client='0.0.0.0'
对如上的参数做如下说明:
查看节点IP:
$ JOIN_IP="$(docker inspect -f '{{ .NetworkSettings.IPAddress }}' consul_server_1)"
也可以直接查看container的IP,如下命令:
$ docker inspect -f '{{ .NetworkSettings.IPAddress }}' consul_server_1
启动第二个节点:
启动 node2并且告诉他通过 $JOIN_IP 加入到 node1:
$ docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_2 consul agent -server -node=2 -join='172.17.0.2'
这里需要对参数作一下说明:
启动第三个节点:
按照同样的方法我们启动 node3:
$ docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_3 consul agent -server -node=3 -join='172.17.0.2'
现在我们就有了一个拥有3个节点的运行在一台机器上的集群。注意,根据Consul Agent的名字给container起了名字。
我们没有暴露出任何一个端口用以访问这个集群, 但是我们可以使用第四个agent节点以client的模式(不是用 -server参数)。这意味着他不参与选举但是可以和集群交互。而且这个client模式的agent也不需要磁盘做持久化。
$ docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_4 consul agent -client -node=4 -join='172.17.0.2' -client='0.0.0.0'
$ docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_5 consul agent -client -node=5 -join='172.17.0.2' -client='0.0.0.0'
$ docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_6 consul agent -client -node=5 -join='172.17.0.2' -client='0.0.0.0'
如果上述命令都能执行成功,就意味着我们的集群搭建成功了。
查看集群的状态:
集群搭建完成以后,我们可以通过浏览器或者终端命令行的形式来查看,集群里面的节点的状态。
浏览器:
我们可以在浏览器中访问localhost:8500端口,可以看到如下效果:
三个serve类型的节点集群节点:
所有的Node节点(server和client):
命令行查看节点状态:
docker exec consul_server_1 consul members