网上有很多在docker中运行Consul集群的文章但是都千篇一律的不能在多个宿主机上运行,
网上的启动方式如下
服务端:
docker run -d -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name=node1 consul agent -server -bind=172.17.0.2 -bootstrap-expect=3 -node=node1
客户端:
sudo docker run -d -e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' --name=node2 consul agent -server -bind=172.17.0.3 -join=172.17.0.2 -node-id=$(cat /proc/sys/kernel/random/uuid) -node=node2
从绑定的IP还有端口可以看出来,客户端服务端只能同时在一台物理主机上运行。172.17.0.2这个ip就是Consul的image自己绑定的IP,如果再在同一个宿主机上启动一个Consul容器那绑定的IP会自动加1。如果想在另外的宿主机上启动一个Consul客户端是肯定连不上172.17.0.2这个ip的,以上启动模式比较适合开发环境。
如果想在生产环境中的多个宿主机上启动Consul集群应该怎么启动咧!?
加上一个参数就可以了
服务端:假设服务端宿主机ip是192.168.0.7
docker run -d --net=host -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' --name consul-server-bootstrap1 -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 consul agent -server -bootstrap-expect 3 -ui -bind=192.168.0.7 -client=0.0.0.0
这里的启动命令比上面的多了一个--net=host这个就是把容器与宿主机的网卡绑定共享宿主机的网络。
客户端:假设客户端宿主机ip是192.168.0.7
docker run -d --net=host --name consul-agent-1 -d -p 8500:8500 -p 8300:8300 -p 8301:8301 -p 8302:8302 -p 8600:8600 -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' consul agent -ui -bind=192.168.0.8 -retry-join=192.168.0.7
也是一样的加上--net=host
随便记录一下consul的启动参数
默认是不开web界面的加上-ui就把web界面开了默认是8500端口
8300,8301端口是默认的心跳端口
-server就是作为server端
-bootstrap-expect 3 这个就是表示期望提供的SERVER节点数目,数目一达到,它就会被激活,然后就是LEADER了
在加几个命令
docker logs -f consul-server-bootstrap1 查看log
docker exec -t consul-server-bootstrap1 consul members 查看服务端状态
如何在这个里面注册一个服务
服务参数如下
{
"ID": "goodServiceId", //服务id
"Name": "goodService", //服务名
"Tags": [ //服务的tag,自定义,可以根据这个tag来区分同一个服务名的服务
"primary",
"v1"
],
"Address": "127.0.0.1",//服务注册到consul的IP,服务发现,发现的就是这个IP
"Port": 7000, //服务注册consul的PORT,发现的就是这个PORT
"EnableTagOverride": false,
"Check": { //健康检查部分
"DeregisterCriticalServiceAfter": "90m",
"HTTP": "http://www.baidu.com", //指定健康检查的URL,调用后只要返回20X,consul都认为是健康的
"Interval": "10s" //健康检查间隔时间,每隔10s,调用一次上面的URL
}
}
可以通过curl简单注册一个http: //10.0.4.17:8500是Consul的IP
curl http://10.0.4.17:8500/v1/agent/service/register -X PUT -i -H "Content-Type:application/json" -d '{
"ID": "centerServiceId",
"Name": "centerService",
"Tags": [
"primary",
"v1"
],
"Address": "127.0.0.1",
"Port": 6000,
"EnableTagOverride": false,
"Check": {
"DeregisterCriticalServiceAfter": "90m",
"HTTP": "http://www.baidu.com",
"Interval": "10s"
}
}'
暂时还没有研究Consul上的kv的作用