一、前言

当我们开发好微服务之后,考虑到灵活快速持续部署的需要,通常会考虑将其Docker镜像化并在Docker环境下运行。由于微服务个数通常会较多,把所有微服务部署在一台docker主机上是不现实的,因此需要考虑到跨主机通信的问题,对实际部署必然会提出以下几点要求:

1. 微服务作为一个docker container可以在任意host上运行;

2. 同一host上可以运行多个相同的微服务;

3. 运行在同一个host上的微服务之间可以相互通信;

4. 运行在不同host上的微服务也可以相互通信;

5. 每个微服务的ip地址不受host所在本地局域网ip地址段限制,即拥有独立网段,避免占用本地IP地址,同时确保container数量受限尽量小;

6. 每个微服务container避免通过端口暴露的方式相互通信,确保不会因端口独占而导致无法灵活部署。

综上原因,docker swarm模式下将各微服务加入同一个overlay network网络的方式实现微服务之间的相互通信。

二、总体架构图(来源网络)

说明:

如图所示,假设本地局域网段10.159.62.0/24中存在主机10.159.62.231,10.159.62.232和10.159.62.233互联互通

每个主机上都运行dockerengine,通过docker engine运行若干个docker container,例如图中的Order,Billing等等。

将这3台主机建立成为一个dockerswarm集群

创建一个docker overlay网络(网段10.10.0.0/24),每个主机上的container都被加入到该overlay网络中,通过overlay网络实现跨主机的container相互通信

假设console,terminal和api这三个服务均需要暴露端口到物理网络,因为物理网络10.159.62.0/24无法直接访问overlay网络中的container,需要container中映射端口到物理网络。

overlay网络中的container默认通过与主机之间的bridge访问物理网络。

三、创建Swarm 集群

1.准备机器3台

l172.17.0.201

l172.17.0.143

l172.17.0.89

在主机201上创建管理节点

$ docker swarm init --advertise-addr 172.17.0.201

执行完会显示

Swarm initialized: current node (vjvp9h9cu1q1umerisj579g4r) is now a manager.

To add a worker to this swarm, run the following command:

docker swarm join --token SWMTKN-1-5fv3wqbq809m85y3h4f6xptmls4wxdn4evntgvij9fkldon6af-8n05wlyxoq3ckmv4bd5pj3x4g 172.17.0.201:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

swarm集群需要使用到相同的Overlay network(网卡),所以我们应该给另外的节点也设置为管理节点,通过命令docker swarm join-token manager

在201,89服务器生成管理节点token(也可以先成工作节点,再升级为管理节点)执行完会显示:

To add a manager to this swarm, run the following command:

docker swarm join --token SWMTKN-1-5fv3wqbq809m85y3h4f6xptmls4wxdn4evntgvij9fkldon6af-8i3ekx4n8ht9nezb8pk4s8hft 172.17.0.201:2377

2. 在主机143上创建管理节点

$ docker swarm join --token SWMTKN-1-5fv3wqbq809m85y3h4f6xptmls4wxdn4evntgvij9fkldon6af-8i3ekx4n8ht9nezb8pk4s8hft 172.17.0.201:2377

3.在主机89上创建管理节点

$ docker swarm join --token SWMTKN-1-5fv3wqbq809m85y3h4f6xptmls4wxdn4evntgvij9fkldon6af-8i3ekx4n8ht9nezb8pk4s8hft 172.17.0.201:2377

通过任意一个节点命令可以查询节点名称

docker node ls(目前设置的为两个节点)

节点的hostname 没有可读性,可以通过下面命令修改各个服务器的hostname(不设置可以忽略此部分)

# hostnamectl set-hostname manger201 # systemctl restart docker

再次docker node ls如下

四、构建Overlay network(容器互通的关键)

在管理节点主机201上执行

docker network create -d overlay --subnet=10.10.0.0/16 --gateway=10.10.0.254 --attachable=true my-network-overlay

通过docker network ls命令查看到生成的集群网卡,另外两台服务器节点通过该命令也可以查看到这个集群网络

扩展部分(dubbo2.7.X版本以上需要设置)

由于dubbo2.7.6后zk注册中心消费者使用的容器ip是docker swarm network网卡的docker_gwbridge

需要将集群中所有节点的

docker_gwbridge改为相同的网段,否则远程调用将调用不通(nacos注册中心用的是my-network-overlay网段,不需要设置docker_gwbridge),修改方式参考:

https://www.cnblogs.com/yyxianren/p/10892066.html

查看当前网段

docker network inspect docker_gwbridge

删除网段

docker network rm docker_gwbridge

如果报次错需要先解散集群再进行删除操作

Error response from daemon: error while removing network: network docker_gwbridge id 6bb302db0876b57762afbe49d0c3df1641a9da59c20d4640530c53585f9b457b has active endpoints

使用以下命令先解散集群再删除:

docker swarm leave

docker network rm docker_gwbridge

service docker restart

如果为从管理节点143,89,先降级为任务节点,再解散

如果为主管理节点201,则需要重新初始化集群和重建Overlay network网络,按步骤三和步骤四进行操作

生成网段,由于是docker_gwbridge 网卡scope 是local,所以需要所有集群节点进行重新生成

docker network create --subnet 172.21.0.0/20 --gateway 172.21.0.1 -o com.docker.network.bridge.enable_icc=false -o com.docker.network.bridge.name=docker_gwbridge docker_gwbridge

五、部署服务

根据上文架构图中所示分别在各主机上执行类似的命令,将各微服务docker container启动起来。

对于不需要暴露端口的微服务,命令类似如下

$ docker run --name order --network=my-network-overlay 10.159.62.231/somecom/order:1.0.0 &

通过--network=my-network-overlay 加入到集群同一网段,这样就可以实现跨主机的容器联通

docker swarm模式跨主机连接的更多相关文章

  1. Docker容器的跨主机连接

    Docker容器的跨主机连接 Docker容器的跨主机连接 使用网桥实现跨主机容器连接 网络拓扑 网络连接使用的是Bridge 操作 修改/etc/network/interfaces文件,分配静态I ...

  2. Docker学习(15) Docker容器的跨主机连接

    Docker容器的跨主机连接 Docker使用网桥跨主机容器连接 Docker使用Open cSwitch实现跨主机容器连接 Docker使用weave实现跨主机容器连接

  3. Docker 容器的跨主机连接

    使用网桥实现跨主枳容器连接 不推荐 使用OpenvSwitch实现跨主机容器连接 OpenvSwitch: OpenvSwitch是一个高质量的.多层虚拟交换枳,使用开源Apache2.0许可协议,由 ...

  4. Docker的跨主机连接:

    1使用网桥实现跨主机容器连接. 2使用open vswitch虚礼的交换机实现跨主机容器连接. 3使用weave开源项目工具实现跨主机连接. 使用网桥实现跨主机容器连接:在同一个docker的主机中d ...

  5. docker实现跨主机连接

    实验环境: centos7系统 host1:192.168.42.128 host2:192.168.42.129 dokcer容器跨主机连接 1.使用网桥实现跨主机容器连接 2.使用Open vSw ...

  6. Docker系列04—跨主机网络方案(overlay/weave)

    在前面详细讲解了几种网络模式:none,host,bridge,container.他们解决了单个主机间的容器的通信问题,并不能实现多个主机容器之间的通信. 跨主机网络方案包括两大类: 1,docke ...

  7. Docker - 用Flannel跨主机

    试了下比较流行的几种SDN,感觉flannel还是比较好用,这里简单记录一下. 用的是virtualbox,3个机器,分别为: genesis : inet 192.168.99.103/24 brd ...

  8. 9.1docker容器 跨主机连接

    open vswitch 实现跨主机容器连接          准备条件   将本地的网卡 与新建的网桥建立连接   配置 docker 启动项       weave实现跨主机容器连接   null

  9. 利用虚拟网桥实现Docker容器的跨主机访问

    最近在研究Docker,Docker的网络配置是比较令人头疼的部分,尤其是跨主机的容器间通信,很多解决方案都比较复杂,这里,我只用虚拟网桥来实现Docker的跨主机访问,分享出来,希望对Docker学 ...

随机推荐

  1. Codeforces Round #552 (Div. 3) E. Two Teams (模拟,优先队列,双向链表)

    题意:有\(n\)个队员站成一排,有两个教练分别选人,每次选当前剩余人中的能力值最大的那个以及他两边相邻的\(k\)个人,问最后每个人所在队伍情况. 题解:优先队列模拟,以及双向链表,先用结构体存入每 ...

  2. vs2017创建文件模板(自动添加创建信息:创建者,创建日期等信息)

    很多小伙伴在创建新的类的时候都要都要手动写类的注释,如作者名称.创建日期.版本等等,当有几个类的时候还可以手动写写,但有几十个或者更多的类的时候就麻烦了,所以我们可以设定Visual Studio 2 ...

  3. 搭建基于springboot轻量级读写分离开发框架

    何为读写分离 读写分离是指对资源的修改和读取进行分离,能解决很多数据库瓶颈,以及代码混乱难以维护等相关的问题,使系统有更好的扩展性,维护性和可用性. 一般会分三个步骤来实现: 一. 主从数据库搭建 信 ...

  4. linux环境下使用jmeter进行分布式测试

    1.前言 熟练使用jmeter进行性能测试的工程师都知道,jmeter的客户端性能是有点差的.这会导致一个问题,其客户端的性能损耗会干扰到性能测试的结果,而且当线程数/并发大到一定程度时,客户端性能会 ...

  5. k8s-3-容器云监控系统

    apollo小结 课程目录 一.容器云监控prometheus概述 https://prometheus.io/docs/introduction/overview/ #官方文档 https://gi ...

  6. 使用DTK创建模糊背景窗口并自定义阴影效果

    DTK是deepin开发的基于Qt的开发套件,提供了大量的具有独特风格的美化控件,也提供了很多非常方便的API,下边我们用DTK实现一个模糊窗口,并设置其阴影效果. 使用场景 一切需要模糊窗口作为美化 ...

  7. Python_变量作用域与修改

    引用全局变量,不需要golbal声明,修改全局变量,需要使用global声明,特别地,列表.字典等如果只是修改其中元素的值(而不是整体赋值的形式),可以直接使用全局变量,不需要global声明. 参考 ...

  8. 洛谷p2216 多次单调队列,扫描矩阵中的最大值减去最小值最的固定大小子矩阵

    #include <iostream> #include <cstdio> #include <cstring> using namespace std; int ...

  9. 设计模式六大原则 All In one

    设计模式六大原则 All In one 开闭原则: 对扩展开放,对修改关闭; 设计模式的六大原则: 0.总原则-开闭原则 对扩展开放, 对修改封闭; 在程序需要进行拓展的时候, 不能去修改原有的代码, ...

  10. redux 中间件 redux-saga 使用教程

    redux 中间件 redux-saga 使用教程 redux middleware refs https://redux-saga.js.org/docs/ExternalResources.htm ...