由于开发需要,需要在本地运行一个Consul环境,由于电脑上已经有Docker环境了,于是就直接在Docker里面搭一套Consul集群。
但是在使用过城中遇到一点小坑。

Docker搭建Consul集群

集群要求要有3Server,将容器8500端口映射到主机8900端口,同时开启管理界面

搭建集群

1. 启动第1个Server节点

docker run -d --name=consul1 -p 8500:8500 -e CONSUL_BIND_INTERFACE=eth0 consul:1.6.2 agent --server=true --bootstrap-expect=3 --client=0.0.0.0 -ui

2. 获取consul1的ip地址

JOIN_IP="$(docker inspect -f '{{.NetworkSettings.IPAddress}}' do1_consul1)";

3. 启动第2个Server节点,并加入集群

docker run -d --name=consul2 -e CONSUL_BIND_INTERFACE=eth0 consul:1.6.2 agent --server=true --client=0.0.0.0 --join $JOIN_IP

4. 启动第3个Server节点,并加入集群

docker run -d --name=consul3 -e CONSUL_BIND_INTERFACE=eth0 consul:1.6.2 agent --server=true --client=0.0.0.0 --join $JOIN_IP

5. 启动第4个Client节点,并加入集群

docker run -d --name=consul4 -e CONSUL_BIND_INTERFACE=eth0 consul:1.6.2 agent --server=false --client=0.0.0.0 --join $JOIN_IP

浏览器访问 http://localhost:8500验证是否部署成功。

导入kv

1. 将kv.json复制到容器内

docker cp ~/Desktop/consul_kv.json consul1:/tmp

2. 导入kv.json

docker exec consul1 consul kv import @/tmp/consul_kv.json

IDEA跑服务注册到Consul

遇到的坑

consul集群跑起来之后,于是在IDEASpringCloud项目注册到部署好的Consul服务,当服务注册好之后,检查其健康状态,发现服务一直提示All node checks passing报了个小红叉❌。

解决

通过各种尝试都发解决之后,发现是因为在容器内部调用容器外(宿主机)的相应服务的时候网络不通,导致健康检查一直处于失败的状态,于是,修改SpringCloud工程的配置文件,新增配置:

spring.cloud.consul.discovery.preferIpAddress=true
spring.cloud.consul.discovery.ipAddress=docker.for.mac.host.internal

重新启动服务,各项检查都正常了。

  • 以上操作环境是macOS,未在别的环境重现和解决这个问题。
  • 容器内可以通过docker.for.mac.host.internal访问宿主机网络和端口。