overlay网络简介

前面介绍过的host网络模式和bridge网络模式都是在单体的docker服务器上的容器间的网络通信。对于多个docker服务器上的多个容器间网络通信就需要使用到overlay网络模式了。

overlay网络常常用于docker swarm集群上的服务编排。当初始化docker swarm集群或者docker主机加入已存在的swarm集群时,会默认创建一个叫ingress的overlay网络和一个叫docker_gwbridge的bridge网络。其中docker_gwbridge的作用是将ingress跟宿主机的网络接口连接,这样才能将流量发送到swarm集群的每个节点上实现网络通信。

如果创建一个swarm集群的服务而没有自定义网络,那么会默认将服务连接到ingress的overlay网络上。建议每个swarm集群的服务都自定义overlay网络,这样可以实现不同的swarm集群服务间的网络隔离。

接下来说明overlay网络的使用,需要准备两台台已安装docker的服务器,一台初始化为manager节点,另一台加入swarm集群作为worker节点,可参考Docker系列之Docker Swarm容器管理与调度。

注: swarm集群需要用2377、7946、4798端口,配置防火墙的端口白名单或关闭防火墙。

使用overlay网络编排部署服务

使用swarm集群部署编排服务,其网络可以先创建好,而后在docker-compose.yml中配置引用。也可以直接在docker-compose.yml中定义,部署服务时会自动创建网络。

注: swarm集群管理的相关命令只能在manager节点运行。

自定义overlay网络:

$ docker network create -d overlay --subnet=10.11.0.0/16 my-overlay

定义一个overlay网络,名为my-overlay,网段为10.11.0.0/16。

查看网络列表:

$ docker network lsNETWORK ID          NAME                DRIVER              SCOPE20706abe43b3        bridge              bridge              local87e7be65d0ce        docker_gwbridge     bridge              locald2ad0895e4f3        host                host                local3rrki5qjsbr4        ingress             overlay             swarmqse9xsv76lbp        my-overlay          overlay             swarm8e5de9308b80        none                null                local

在manager节点可以看到新创建的my-overlay在列表中,如果此时直接在worker节点上执行docker network ls是看不到my-overlay网络的,当部署swarm集群服务并且引用my-overlay网络,将服务部署在worker节点上时,就可以看到my-overlay网络已创建。

下面以一个tomcat与redis的服务编排来验证一下跨宿主机的网络通信。

在docker-compose.yml中引用网络,如下:

version: '3'services:tomcat:image: tomcat:8.5networks:      - tc-netports:      - 8080:8080deploy:replicas: 2restart_policy:condition: anyredis:image: redis:5.0networks:      - tc-netdeploy:replicas: 1restart_policy:condition: anynetworks:tc-net:driver: overlayexternal:name: my-overlay

作为参考,在docker-compose.yml中定义网络:

...networks:  tc-net:    driver: overlay    ipam:       config:        - subnet: 10.15.0.0/26

在docker-compose.yml中定义tomcat和redis两个服务,使用external属性来引用已经创建好的网络my-overlay。

部署服务:

# manager节点docker stack deploy -c docker-compose.yml tc

查看服务:

# manager节点$ docker stack ps tc

ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS1l0pkds2izjh        tc_tomcat.1         tomcat:8.5          docker-manager      Running             Running 5 minutes ago6icmjpn4wugt        tc_redis.1          redis:5.0           docker-manager      Running             Running 5 minutes agoz2j2nahaxe3j        tc_tomcat.2         tomcat:8.5          docker-worker       Running             Running 5 minutes ago

可以看到tomcat服务在manager和worker节点各有一个,redis服务在manager节点。

接下来分别在manager节点和worker节点上进入到tomcat容器中ping一下redis服务,来验证一下跨docker主机的网络通信。

manager节点

$ docker ps

CONTAINER ID        IMAGE               COMMAND                     CREATED              STATUS              PORTS               NAMES739058b19824        tomcat:8.5          "catalina.sh run"           About a minute ago   Up 58 seconds       8080/tcp            tc_tomcat.1.1l0pkds2izjhju9phcil1mv02a59d511157f4        redis:5.0           "docker-entrypoint.sh..."   About a minute ago   Up About a minute   6379/tcp            tc_redis.1.6icmjpn4wugtx22xqie0bofq2
$ docker exec -it 739058b19824 bashroot@739058b19824:/usr/local/tomcat# ping -c 2 redis

PING redis (10.11.40.60) 56(84) bytes of data.64 bytes from 10.11.40.60 (10.11.40.60): icmp_seq=1 ttl=64 time=0.052 ms64 bytes from 10.11.40.60 (10.11.40.60): icmp_seq=2 ttl=64 time=0.040 ms

--- redis ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 134msrtt min/avg/max/mdev = 0.040/0.046/0.052/0.006 ms

在manager节点上是可以ping通redis服务的。

worker节点

$ docker psCONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMESdd3e3301de7d        tomcat:8.5          "catalina.sh run"        About a minute ago   Up About a minute   8080/tcp            tc_tomcat.2.z2j2nahaxe3j403j21at7j9a6
$ docker exec -it dd3e3301de7d bashroot@dd3e3301de7d:/usr/local/tomcat# ping -c 2 redis

PING redis (10.11.40.60) 56(84) bytes of data.64 bytes from 10.11.40.60 (10.11.40.60): icmp_seq=1 ttl=64 time=0.053 ms64 bytes from 10.11.40.60 (10.11.40.60): icmp_seq=2 ttl=64 time=0.067 ms

--- redis ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 2msrtt min/avg/max/mdev = 0.053/0.060/0.067/0.007 ms

可以看到在worker节点上同样可以ping通redis服务。

以上也能说明通过自定义overlay网络实现了跨宿主机的网络通信,这也是常用swarm集群部署服务的原因所在。

使用overlay实现单个容器服务与swarm集群服务的通信

在compose file的3.2版本后增加了对网络设置的attachable属性,将其设置为true,可以实现单个容器连接swarm集群服务的overlay网络,从而实现单个容器与swarm集群的服务间的网络通信。

注: 单个容器与swarm集群服务进行网络通信的前提是,单个容器所在的宿主机需要加入到swarm集群作为一节点。

下面以tomcat的swarm集群为例,在外部启动redis服务,将redis连接到tomcat所在的overlay网络,而后验证他们之间的网络通信。

manager节点

tomcat服务的compose file如下:

version: '3.2'services:  tomcat:    image: tomcat:8.5    networks:      - tc-net    ports:      - 8080:8080    deploy:      replicas: 2      restart_policy:        condition: anynetworks:  tc-net:    driver: overlay    attachable: true    ipam:      config:        - subnet: 10.15.0.0/26

部署服务:

$ docker stack deploy -c docker-compose.yml tc

查看网络:

$ docker network ls

NETWORK ID          NAME                DRIVER              SCOPE927ca7d69973        bridge              bridge              local87e7be65d0ce        docker_gwbridge     bridge              locald2ad0895e4f3        host                host                local3rrki5qjsbr4        ingress             overlay             swarmpknwl0oj3iu2        my-overlay          overlay             swarm8e5de9308b80        none                null                local650m9x2wl04j        tc_tc-net           overlay             swarm

在网络列表中新增了一个tc_tc-net,这也是我们在compose file中定义的overlay网络。

在manager节点上运行一个redis的单容器服务,指定其连接到tomcat所在的overlay网络:

$ docker run --name my_redis -it -d -p 6379:6379 --network tc_tc-net redis:5.0
$ docker ps

CONTAINER ID        IMAGE               COMMAND                     CREATED             STATUS              PORTS                    NAMES481fbb0e5b78        redis:5.0           "docker-entrypoint.sh..."   4 seconds ago       Up 2 seconds        0.0.0.0:6379->6379/tcp   my_redis254e161ae63c        tomcat:8.5          "catalina.sh run"           34 seconds ago      Up 33 seconds       8080/tcp                 tc_tomcat.2.ttonphlbithf2g2ocgsqltnna

接下来验证网络通信,进入tomcat服务,ping一下redis的服务,如下:

$ docker exec -it 254e161ae63c bashroot@254e161ae63c:/usr/local/tomcat# ping -c 2 my_redis

PING my_redis (10.15.0.7) 56(84) bytes of data.64 bytes from my_redis.tc_tc-net (10.15.0.7): icmp_seq=1 ttl=64 time=0.066 ms64 bytes from my_redis.tc_tc-net (10.15.0.7): icmp_seq=2 ttl=64 time=0.066 ms

--- my_redis ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 2msrtt min/avg/max/mdev = 0.066/0.066/0.066/0.000 ms

worker节点

$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES58083e1ac1c7        tomcat:8.5          "catalina.sh run"        2 minutes ago       Up 2 minutes        8080/tcp            tc_tomcat.1.ecdd4yhm2wrnqjeobi2j6c7f5
$ docker exec -it 58083e1ac1c7 bashroot@58083e1ac1c7:/usr/local/tomcat# ping -c 2 my_redis

PING my_redis (10.15.0.7) 56(84) bytes of data.64 bytes from my_redis.tc_tc-net (10.15.0.7): icmp_seq=1 ttl=64 time=0.569 ms64 bytes from my_redis.tc_tc-net (10.15.0.7): icmp_seq=2 ttl=64 time=0.424 ms

--- my_redis ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 3msrtt min/avg/max/mdev = 0.424/0.496/0.569/0.075 ms

以上,实现和验证了单个容器与swarm服务集群间的网络通信。

如果有收获欢迎分享给你的朋友一起学习和讨论,也欢迎扫码关注公众号进击的极客。

相关链接:

Docker系列之Docker Swarm容器管理与调度

Docker网络篇之bridge网络

主机overlay和网络overlay_Docker网络篇之overlay模式相关推荐

  1. 网络号和主机号具体计算原理-ipv4篇

    来自之前163网易博客,因博客倒闭,放CSDN供 大家学习. 1.标准分类的ip地址的网络号是, A类是前8位 B类是前16位 C类是前24位 举一个例子 如172.16.10.2,因为172.16. ...

  2. docker 获取宿主机ip_Docker基础修炼6——网络初探及单机容器间通信

    如果觉得文章有帮助,欢迎点击头像关注我获取更多原创文章,同时也欢迎转发. 同时也可以在我的历史文章中找到Linux操作系统相关的服务器运维管理入门系列文章,欢迎交流. 前文演示docker容器内部数据 ...

  3. 数据中心网络里的Underlay和Overlay

    数据中心网络里的Underlay和Overlay Underlay网络        以太网从最开始设计出来就是一个分布式网络,没有中心的控制节点,网路中的各个设备之间通过协议传递的方式学习网络的可达 ...

  4. as 不显示gradle视图_Python构建RESTful网络服务[Django篇:基于类视图的API]

    系列文章介绍 本系列文章将详细介绍将Django官方引导教程中的投票项目改写为RESTful网络服务.Django官方教程地址https://docs.djangoproject.com/zh-han ...

  5. iOS网络缓存扫盲篇--使用两行代码就能完成80%的缓存需求

    原文地址:https://github.com/ChenYilong/ParseSourceCodeStudy/blob/master/02_Parse的网络缓存与离线存储/iOS网络缓存扫盲篇.md ...

  6. Silverlight+WCF 实战-网络象棋最终篇之对战视频-下篇[客户端发送与服务端中转](六)...

    本篇继上一篇:Silverlight+WCF 实战-网络象棋最终篇之对战视频-上篇[客户端开启视频/注册编号/接收视频](五)  一:对战视频 简单原理 略,内容见上篇. 二:对战视频 步骤解析: 略 ...

  7. Silverlight+WCF 实战-网络象棋最终篇之对战视频-上篇[客户端开启视频/注册编号/接收视频](五)...

    前言: 近期在忙点"秋色园"的事情,所以网络象棋这一块文章就写的相对慢,而且刚好接上篇:Silverlight+WCF 实战-网络象棋最终篇之非线程阻塞倒计时窗口(四)  之后, ...

  8. TCP/IP学习——利用主机IP与子网掩码计算网络号

    阿里巴巴的一道题目,是关于利用主机IP与子网掩码计算网络号. 在此之前,我们需要先了解下五类IP地址. 在同一个物理网络上的主机的地址都有一个相同前缀,即IP地址分成两个部分:netid,hostid ...

  9. 菜鸟学习笔记:Java提升篇9(网络1——网络基础、Java网络编程)

    菜鸟学习笔记:Java提升篇9(网络1--网络基础.Java网络编程) 网络基础 什么是计算机网络 OS七层模型 Java网络编程 InetAddress InetSocketAddress URL类 ...

最新文章

  1. 智能文档理解:通用文档预训练模型
  2. expect安装使用
  3. 单图像三维重建、2D到3D风格迁移和3D DeepDream
  4. 继续- 管理百人研发团队的烦恼(下)
  5. 6、检查约束(CHECK)
  6. 直播系统:泛娱乐直播新趋势
  7. mxnet基础到提高(46)-ndarray.zeros,CSRNDArray稀疏矩阵
  8. sql server cdc 清理_基于CDC技术的ElasticSearch索引同步机制
  9. 线程 -- ThreadLocal
  10. 编译原理第二版5.1答案
  11. WIN11 TortoiseSVN 无论什么操作,都报同一个错误:请求的操作需要提升
  12. Linux安装R相关包出现icudt error
  13. 智能体重秤方案/案列/APP/小程序
  14. 斐波那契序列的实现方法及对比
  15. 视频教程-微信小程序开发实战之番茄时钟开发-微信开发
  16. Python采集常用:谷歌浏览器驱动——Chromedriver 插件安装教程
  17. android 代码设置密码,android-如何在MIFARE Ultralight EV1标签上设置和取消设置密码?...
  18. CBS paper防伪安全纸
  19. 达人评测 RTX3060和RX 6600M选哪个好
  20. 使用Auto.js实现蚂蚁森林自动收取能量

热门文章

  1. Django 3.2.5博客开发教程:实现模板之前的分析与准备
  2. GIS基本知识学习PDF文档
  3. Linux使用ffmpeg合并视频
  4. Scala模式匹配:变量声明中的模式匹配
  5. Docker安装启动influxDB数据库及建库查询基本操作
  6. Spring @ConfigurationProperties注解使用示例
  7. eureka之EurekaClientConfig的作用
  8. Freemarker基于模板字符串生成静态化html文件
  9. spring boot模板引擎thymleaf用法详解
  10. Vim取消查找后的高亮提示,:nohl或者:noh什么的都不管用,来一个简单粗暴方法