由于开发需要,需要在本地运行一个Consul环境,由于电脑上已经有Docker环境了,于是就直接在Docker里面搭一套Consul集群。
但是在使用过城中遇到一点小坑。
Docker搭建Consul集群
集群要求要有
3
个Server
,将容器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
集群跑起来之后,于是在IDEA
跑SpringCloud
项目注册到部署好的Consul
服务,当服务注册好之后,检查其健康状态,发现服务一直提示All node checks passing
报了个小红叉❌。
解决
通过各种尝试都发解决之后,发现是因为在容器内部调用容器外(宿主机)的相应服务的时候网络不通,导致健康检查一直处于失败的状态,于是,修改SpringCloud
工程的配置文件,新增配置:
spring.cloud.consul.discovery.preferIpAddress=true |
重新启动服务,各项检查都正常了。
- 以上操作环境是
macOS
,未在别的环境重现和解决这个问题。 - 容器内可以通过
docker.for.mac.host.internal
访问宿主机网络和端口。