Docker跨服务器通信Overlay解决方案(下) Consul集群
承接上文
本文基于上篇文章,详细的场景说明与分析在前篇随笔中业已记录,有兴趣可以移步 Docker跨服务器通信Overlay解决方案(上) Consul单实例
本文主旨
本文为Docker使用Consul集群实现Overlay网络,解决Docker跨服务器内网通信问题。
整体架构为:Nginx + 3 x Conul

Consul集群搭建
环境说明
| 服务器OS | 主机IP | Docker版本 | 网卡名 | 主机名 |
|---|---|---|---|---|
| Ubuntu Server 18.04 LTS | 192.168.87.133 | 18.09.6 | ens33 | hz |
| Ubuntu Server 18.04 LTS | 192.168.87.139 | 18.09.7 | ens33 | hz2 |
| Ubuntu Desktop 18.04 LTS | 192.168.87.135 | 18.09.7 | ens33 | hz3 |
搭建过程
133服务器
docker run -d --network host -h node1 --name=consul-leader \
-e CONSUL_BIND_INTERFACE=ens33 \
-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
--restart=always \
-v /home/hellxz/consul-data:/tmp/consul \
consul:1.5.2 agent -server -bind=192.168.87.133 -bootstrap-expect=3 \
-node=node1 -data-dir=/tmp/consul -client 0.0.0.0 -ui
139服务器
docker run -d --network host -h node2 --name=consul-server \
-e CONSUL_BIND_INTERFACE=ens33 \
-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
--restart=always \
-v /home/hellxz/consul-data:/tmp/consul \
consul:1.5.2 agent -server -bind=192.168.87.139 -join=192.168.87.133 \
-node=node2 -data-dir=/tmp/consul -client 0.0.0.0 -ui
135服务器
docker run -d --network host -h node3 --name=consul-server2 \
-e CONSUL_BIND_INTERFACE=ens33 \
-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
--restart=always \
-v /home/hellxz/consul-data:/tmp/consul \
consul:1.5.2 agent -server -bind=192.168.87.135 -join=192.168.87.133 \
-node=node3 -data-dir=/tmp/consul -client 0.0.0.0 -ui
常用参数说明
CONSUL_BIND_INTERFACE:指向当前要使用的网卡,这里一定要注意自己ip对应的网卡CONSUL_LOCAL_CONFIG:添加服务的配置,容器创建后会生成local.json,json串会添加进来--restart=always:启动失败自动重启-v挂载的数据目录一般用于-sever节点,其映射的位置与-data-dir保持一致-join:加入到其它节点-node:当前节点名-data-dir:数据保存目录,-server节点才需要设置,只有server节点保存数据-bind:绑定自己展示的ip,这里最好是写宿主机的ip
更详细的参数说明
-advertise:通知展现地址用来改变我们给集群中的其他节点展现的地址,一般情况下-bind地址就是展现地址
-bootstrap:用来控制一个server是否在bootstrap模式,在一个datacenter中只能有一个server处于bootstrap模式,当一个server处于bootstrap模式时,可以自己选举为raft leader。
-bootstrap-expect:在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap公用
-bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0
-client:consul绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1
-config-file:明确的指定要加载哪个配置文件
-config-dir:配置文件目录,里面所有以.json结尾的文件都会被加载
-data-dir:提供一个目录用来存放agent的状态,所有的agent允许都需要该目录,该目录必须是稳定的,系统重启后都继续存在
-dc:该标记控制agent允许的datacenter的名称,默认是dc1
-encrypt:指定secret key,使consul在通讯时进行加密,key可以通过consul keygen生成,同一个集群中的节点必须使用相同的key
-join:加入一个已经启动的agent的ip地址,可以多次指定多个agent的地址。如果consul不能加入任何指定的地址中,则agent会启动失败,默认agent启动时不会加入任何节点。
-retry-join:和join类似,但是允许你在第一次失败后进行尝试。
-retry-interval:两次join之间的时间间隔,默认是30s
-retry-max:尝试重复join的次数,默认是0,也就是无限次尝试
-log-level:consul agent启动后显示的日志信息级别。默认是info,可选:trace、debug、info、warn、err。
-node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
-protocol:consul使用的协议版本
-rejoin:使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。
-server:定义agent运行在server模式,每个集群至少有一个server,建议每个集群的server不要超过5个
-syslog:开启系统日志功能,只在linux/osx上生效
-ui-dir:提供存放web ui资源的路径,该目录必须是可读的
-pid-file:提供一个路径来存放pid文件,可以使用该文件进行SIGINT/SIGHUP(关闭/更新)agent
查看Consul集群状态
访问其中一个节点即可看到集群状态

注意事项
每台运行docker的主机都不能同hostname,可以使用
$ sudo hostnamectl set-hostname your-new-hostname
同hostname会导致同名的主机docker无法互相通信
光有consul集群是不够的,docker只能配置一个注册的url,所以需要做负载均衡,这里使用nginx
Nginx配置
Nginx安装参考http://nginx.org/en/docs/install.html
配置只需要在/etc/nginx/nginx.conf下添加监听与负载均衡的配置
这里将nginx配置在了我的win10上,ip: 10.2.7.59 配置在别处也是一样的
如以下关键片段:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#consul集群负载均衡
upstream consul {
server 192.168.87.133:8500; #可以通过添加weight进行加权重
server 192.168.87.139:8500;
server 192.168.87.135:8500;
}
#监听本机8500端口,转发到upstream consul下
server {
listen 8500;
location / {
proxy_pass http://consul;
}
}
}
保存,重启nginx
配置各服务节点docker daemon
修改 /etc/docker/daemon.json
添加cluster-store与cluster-advertise配置
{
"registry-mirrors": ["https://7uuu3esz.mirror.aliyuncs.com"],
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"},
"insecure-registries": ["10.2.7.70:5000"],
"cluster-store": "consul://10.2.7.59:8500",
"cluster-advertise": "ens33:2375"
}
- cluster-store配置的是nginx监听的地址
- cluster-advertise指定的是docker的宿主机注册到consul中的指定网卡中的ip,也可以写ip和端口号,端口只要没被占用就可以了
重启docker
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
测试
等待docker重启完毕,进入consul的UI

我们可以发现Key/Value下有了docker的key,点开docker有了如上图的docker daemon注册的信息
在以上列表中的133节点上创建个overlay网络 my-overlay-test
$ docker network create -d overlay my-overlay-test

后续的在上篇文章已经测试过了,本文结束,如有问题,望不吝评论!
本文系Hellxz学习与实践文章,禁止布布扣、码迷、爱码网等第三方爬虫网站爬取
Docker跨服务器通信Overlay解决方案(下) Consul集群的更多相关文章
- Docker跨服务器通信Overlay解决方案(上) Consul单实例
场景 公司微服务快上线了,微服务都是用Docker容器进行部署的,在同一台主机下,把服务都部署上,注册到Nacos的IP与PORT都是内网的IP与Dockerfile中定义的端口号,看起来好像也没什么 ...
- Docker应用系列(三)| 构建Consul集群
本示例基于Centos 7,在阿里云的三台机器上部署consul集群,假设目前使用的账号为release,拥有sudo权限. 由于Docker官方镜像下载较慢,可以开启阿里云的Docker镜像下载加速 ...
- docker跨主机通信-overlay
使用consul 1,让两个网络环境下的容器互通,那么必然涉及到网络信息的同步,所以需要先配置一下consul. 直接运行下面命令.启动consul. docker run -d -p 8500:85 ...
- 实战中的asp.net core结合Consul集群&Docker实现服务治理
0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言 在写这篇文章之前,我看了很多关于consul的服务治理,但发现基本上都是直接在powershell或者以命令工具的方式在 ...
- .net core结合Consul集群&Docker实现服务治理
实战中的asp.net core结合Consul集群&Docker实现服务治理 https://www.cnblogs.com/guolianyu/p/9614050.html 0.目录 整体 ...
- Docker跨主机网络——overlay
前言 在Docker网络--单host网络一文中,我为大家总结了Docker的单机网络相关知识和操作,单机网络比较容易.本文我为大家总结Docker跨主机通信相关知识.同样本文大部分内容以CloudM ...
- 通信服务器群集——跨服务器通信Demo(源码)
对于一些基于TCP Socket的大型C/S应用来说,能进行跨服务器通信可能是一个绕不开的功能性需求.出现这种需求的场景类似于下面描述的这种情况. 假设,我们一台TCP应用服务器能同时承载10000人 ...
- 跨域通信的解决方案JSONP
在web2.0时代,熟练的使用ajax是每个前端攻城师必备的技能.然而由于受到浏览器的限制,ajax不允许跨域通信. JSONP就是就是目前主流的实现跨域通信的解决方案. 虽然在在jquery中,我们 ...
- 庐山真面目之十二微服务架构基于Docker搭建Consul集群、Ocelot网关集群和IdentityServer版本实现
庐山真面目之十二微服务架构基于Docker搭建Consul集群.Ocelot网关集群和IdentityServer版本实现 一.简介 在第七篇文章<庐山真面目之七微服务架构Consul ...
随机推荐
- Kafka工作流程分析
Kafka工作流程分析 生产过程分析 写入方式 producer采用推(push)模式将消息发布到broker,每条消息都被追加(append)到分区(patition)中,属于顺序写磁盘(顺序写磁盘 ...
- [leetcode] 7. Reverse Integer (easy)
原题 水题 唯一注意的点就是数字溢出 class Solution { public: int reverse(int x) { long long MAX = ((long long)1 <& ...
- 《C# 语言学习笔记》——定义属性
属性定义的方式与字段类似,但包含的内容比较多. 属性拥有两个类似于函数的块,一个块用于获取属性的值,另一个块用于设置属性的值.这两个块也称访问器,分别用于get和set关键字定义,可以用于控制对属性的 ...
- iframe插入视频自动播放代码
<iframe marginwidth=0 marginheight=0 src='http://www.wsview.com/yzplayerAction!play2.action?autoP ...
- 实现跳转的jsp小例子
<%@page import="java.io.UnsupportedEncodingException"%> <%@ page language="j ...
- python输出九九乘法表
1.脚本如下 (1)倒三角格式的,注意行前的空格 for i in range(1,10): for j in range(i,10): print("%d*%d= ...
- Python装饰器 (转)
多个装饰器执行的顺序就是从最后一个装饰器开始,执行到第一个装饰器,再执行函数本身. #多个装饰器 import time def deco01(func): def wrapper(*args, ** ...
- Currency Exchange POJ1860
Description Several currency exchange points are working in our city. Let us suppose that each point ...
- .NET Core 3.0深入源码理解HttpClientFactory之实战
写在前面 前面两篇文章透过源码角度,理解了HttpClientFactory的内部实现,当我们在项目中使用时,总会涉及以下几个问题: HttpClient超时处理以及重试机制 HttpClient ...
- 作为前端的你,CC游戏开发可以上车
1. 初来乍到 打开 Cocos Creator 点击新建空白项目,在默认布局的左下区域,一个黄黄assets文件夹映入眼帘.作为前端的你对这个文件是不是再熟悉不过了.是的,和你想象的一样,开发游戏中 ...