上一节我们提到了 swarm 的 routing mesh 。当外部访问任意节点的8080端口时,swarm 内部的 load balance 会将请求转发给web_server 其中的一个副本。大概如下图所示:
 
 
所以,无论访问哪个节点,及时该节点上没有运行Service的副本,最终都能访问到Service。
 
另外,我们还可以配置一个外部的 load balance ,将请求路由到 swarm Service 。比如配置HAProxy,将请求分发到各个节点的8080端口。
如下图所示,一共是两层 load balance。
 
 
ingress 网络
 
当我们应用 --publis-add 8080:80 时,swarm 会重新配置service,我们会看到容器发生了以下变化
 
root@host03:~# docker service create --name web_server --replicas 2 tomcat
v2p0yuexiws1g1qs2xj5hmqte
overall progress: 2 out of 2 tasks
1/2: running   [==================================================>]
2/2: running   [==================================================>]
verify: Service converged
root@host03:~# docker service ps web_server
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE             ERROR               PORTS
be17grtfyj33        web_server.1    tomcat:latest       host02              Running             Shutdown 11 seconds ago                       
wsfub26hj5tq        web_server.2    tomcat:latest       host01              Running             Shutdown 14 seconds ago           
 
root@host01:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
1bb657e47d1f        tomcat:latest       "catalina.sh run"   16 seconds ago      Up 14 seconds       8080/tcp            web_server.2.wsfub26hj5tqvufrtvir6nmip
 
root@host02:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
1183f0b73cba        tomcat:latest       "catalina.sh run"   19 seconds ago      Up 17 seconds       8080/tcp            web_server.1.be17grtfyj33nbhyyrhe8dh4c
 
root@host03:~# docker service update --publish-add  8080:8080 web_server
web_server
overall progress: 2 out of 2 tasks
1/2: running   [==================================================>]
2/2: running   [==================================================>]
verify: Service converged
 
root@host03:~# docker service ps web_server
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE             ERROR               PORTS
0y0wh18zbw0l        web_server.1        tomcat:latest       host02              Running             10 seconds ago                        
be17grtfyj33         \_ web_server.1    tomcat:latest       host02              Shutdown            Shutdown 11 seconds ago                       
lvhvtel79hr8        web_server.2        tomcat:latest       host01              Running             Running 13 seconds ago                        
wsfub26hj5tq         \_ web_server.2    tomcat:latest       host01              Shutdown            Shutdown 14 seconds ago           
 
root@host01:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
2fa7f422dfb6        tomcat:latest       "catalina.sh run"   24 seconds ago      Up 21 seconds                 8080/tcp            web_server.2.lvhvtel79hr8yw8fzeoaib0u9
1bb657e47d1f        tomcat:latest       "catalina.sh run"   2 minutes ago       Exited (143) 22 seconds ago                       web_server.2.wsfub26hj5tqvufrtvir6nmip
 
root@host02:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
b1ba99790519        tomcat:latest       "catalina.sh run"   23 seconds ago      Up 20 seconds                 8080/tcp            web_server.1.0y0wh18zbw0lhpks3zbrqdprc
1183f0b73cba        tomcat:latest       "catalina.sh run"   2 minutes ago       Exited (143) 21 seconds ago                       web_server.1.be17grtfyj33nbhyyrhe8dh4c
 
root@host01:~# docker exec web_server.2.lvhvtel79hr8yw8fzeoaib0u9 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
1141: eth0@if1142: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
    link/ether 02:42:0a:ff:00:0c brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.255.0.12/16 brd 10.255.255.255 scope global eth0
       valid_lft forever preferred_lft forever
1143: eth1@if1144: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth1
       valid_lft forever preferred_lft forever
 
root@host02:~# docker exec web_server.1.0y0wh18zbw0lhpks3zbrqdprc ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
1237: eth0@if1238: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group default
    link/ether 02:42:0a:ff:00:0d brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.255.0.13/16 brd 10.255.255.255 scope global eth0
       valid_lft forever preferred_lft forever
1239: eth1@if1240: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth1
       valid_lft forever preferred_lft forever
 
root@host01:~# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
d4b0862f06c8        bridge              bridge              local
d883d53943b2        docker_gwbridge     bridge              local
358643b57976        host                host                local
sngp88bsqode        ingress             overlay             swarm
f5d2888b2321        none                null                local
 
root@host02:~# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
3fd2a4a2ffc0        bridge              bridge              local
d8c36dcdd92a        docker_gwbridge     bridge              local
3a8925305a80        host                host                local
sngp88bsqode        ingress             overlay             swarm
ce845103f54d        none                null                local
 
之前所有的副本都被shutdown了,然后启动了新的副本,在新的副本里面可以看到两块网卡
    eth0 连接 overlay 类型的网络,名字是 ingress,其作用是让运行在不同主机上的容器可以互相通信。
    eth1 连接的是一个 bridge 类型的网络,名字为 docker_gwbridge,其作用是让容器能都访问到外网
 
ingress 网络是swarm创建时 Docker 自动为我们创建的,swarm中每个 node 都能使用ingress 。
 
通过 overlay 网络,主机与容器,容器与容器之间可以互相访问。同时,routing mesh 将外部请求路由到不同主机的容器,从而实现了外部网络对service的访问。
 

100、神器的 routing mesh (Swarm07)的更多相关文章

  1. 神奇的 routing mesh - 每天5分钟玩转 Docker 容器技术(100)

    接上一节案例,当我们访问任何节点的 8080 端口时,swarm 内部的 load balancer 会将请求转发给 web_server 其中的一个副本. 这就是 routing mesh 的作用. ...

  2. docker swarm mode routing mesh 使用

    Docker Engine swarm mode makes it easy to publish ports for services to make them available to resou ...

  3. (转) Docker - Docker1.12服务发现,负载均衡和Routing Mesh

    看到一篇介绍 Docker swarm以及如何编排的好文章,挪放到这里,自己学习的同时也分享出来. 原文链接: http://wwwbuild.net/dockerone/414200.html -- ...

  4. Docker 入门 第四部分: Swarms

    目录 Docker 入门 第四部分: Swarms 先决条件 介绍 理解Swarm集群 部署swarm 创建一个集群 在swarm集群上部署你的app应用 为 swarm管理器配置一个docker-m ...

  5. Docker:Swarms

    Prerequisites Install Docker version 1.13 or higher. Get Docker Compose as described in Part 3 prere ...

  6. Docker3之Swarm

    Make sure you have published the friendlyhello image you created by pushing it to a registry. We’ll ...

  7. docker swarm英文文档学习-3-开始

    https://docs.docker.com/engine/swarm/swarm-tutorial/ 1)Getting started with swarm mode 本教程向你介绍Docker ...

  8. docker swarm overlay stack 服务部署记录

    项目xxx(后端),xxx-ui前端(前后端分离的项目) 依赖mysql,elasticsearch.分别制作了四个镜像来做这件事.希望可以制作跨主机的部署,使用了swarm,以下是学习记录. 参考 ...

  9. 【09】循序渐进学 docker:docker swarm

    写在前面的话 至此,docker 的基础知识已经了解的差不多了,接下来就来谈谈对于 docker 容器,我们如何来管理它. docker swarm 在学习 docker swarm 之前,得先知道容 ...

随机推荐

  1. TCP 之 TCP_NEW_SYN_RECV状态

    概述 以前的TCP请求控制块没有独立的状态,而是依赖于他们的父控制块的状态,也就是TCP_LISTEN状态,现在要把请求控制块加入到全局的ehash中,所以需要一个状态,而TCP_SYN_RECV状态 ...

  2. 基本CSS布局

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  3. EBS GL 日记账行“账户说明”段说明显示不全

    问题描述: 路径:总帐管理超级用户/日记帐/输入 如下图所示,日记账行的“账户说明字段”段值说明显示不全 解决方法: 路径:总帐管理超级用户/设置/财务系统/弹性域/关键字/段 如下图所示,找到相应的 ...

  4. 阶段3 3.SpringMVC·_07.SSM整合案例_05.ssm整合之Spring整合SpringMVC的框架

    点击超连接,执行controller里面的方法 那么就需要在Controller里面定义Service对象,就需要依赖注入进来. 启动tomcat服务器,web.xml里面的前端控制器会帮我加载spr ...

  5. spring boot系列(三)spring boot 配置spring data jpa

    数据库使用MySQL,ORM使用spring data jpa 1 因此需要再pom.xml文件中添加相应jar包.如下: <!-- 引入jap --> <dependency> ...

  6. MongoDB数据节点基础操作

    1.查看集群中各节点的状态: rs0:PRIMARY> rs.status() 2.查看集群中各节点配置情况: rs0:PRIMARY> rs.conf() 3.主节点降级为从节点: rs ...

  7. Servlet(3):Cookie

    概念 Cookie是存储在客户端计算机上的文本文件,并保留了各种跟踪信息.Java Servlet支持HTTP Cookie. 识别返回用户包括三个步骤: (1) 服务器脚本向浏览器发送一组Cooki ...

  8. CentOS6.5升级手动安装GCC4.8.2 转载

    一.简易安装 操作环境 CentOS6.5 64bit,原版本4.4.7,不能支持C++11的特性~,希望升级到4.8.2 不能通过yum的方法升级,需要自己手动下载安装包并编译 1.1 获取安装包并 ...

  9. Object.assign()的用法 -- 用于将所有可枚举属性的值从一个或多个源对象复制到目标对象,返回目标对象

    语法: Object.assign(target, …sources) target: 目标对象,sources: 源对象用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.它将返回目标对象. ...

  10. C#与Unity 数据存储

    使用Json存储数据 1.创建Json文件,直接创建txt文件,将后缀名改为xx.json 2.Json文件的数据格式,中括号表示列表,即中括号下的每个逗号隔开的内容都是列表的每个元素,花括号表示对象 ...