背景

近期,公司网络要迁移到新的网段,所以原来在服务器上面搭建的docker swarm需要重新构建。。。

拿到新的服务器地址看了一下,“10.xxx.xxx.xxx" 。。。 纳尼,这IP赶脚是子网的地址段呀,居然用到了服务器上面!唉,算了吧,当时也没多想,可能是自己少见多怪吧。。。于是就把几台服务启动swarm搭建好,配置好了manager和work节点,然后创建了Overlay网络,在上面用2个busybox的container做了个小测试,container之间可以连接,于是把之前停止的container都启动,完事后这样高高兴兴的下班啦!!(不加班的生活真美好)

第二天一到公司,还没坐稳呢,旁边的哥们就急急忙忙的过来找我,“我们的app无法连接到数据库,报错啦!!”(PS: 我们的app和数据库分别跑在了不同宿主机的container上面,彼此通过docker的子网进行通信)。 奇怪吖,我昨天还试了试可以通信呀,怎么今天就不行了呢??

分析问题

我们总共有3台机器挂在swarm下,有一台机器是manager(我们简单起见,命名为M),另外两台作为worker(W1+W2)加入到swarm集群中。简单的拓扑结构如下图:

昨天,我做测试的时候是用的M与W1,当时没出现问题;今天出现问题的是M与W2,containers 之间无法通信; 之后,我又尝试在W1与W2上面运行containers,也无法通信。。。。

没办法,尝试着重新创建swarm集群,然后再创建跨节点的overlay网络,然而,得到了令人惊奇的结果,这次所有container都无法通信!!

于是,先从swarm集群入手排错,swarm运行正常,没有任何发现。。。再从overlay网络层面进行分析,运行指令:

#docker network inspect myOverlayNet

发现docker默认创建的子网是 10.0.0.0

会不会是由于docker 子网与 host 机器的网络 同在一个网段(10.xxx.xxx.xxx)而导致的冲突呢???

解决

重新建立子网, 这次指定好subnet的网段,为了和host机器区分开来,使用了192.~的网段,命令如下

#docker network create -d overlay --subnet=192.168.0.0/ --attachable myOverlay

在不同的hosts(M, W1 与 W2)上面新建立containers,(busybox1, busybox2 和 busybox3)

## run busybox1 on manage node
# docker run -itd --name=busybox1 --network=myOverlay busybox /bin/sh ## run busybox2 on worker node
# docker run -itd --name=busybox2 --network=myOverlay busybox /bin/sh ## run busybox3 on worker node
# docker run -itd --name=busybox3 --network=myOverlay busybox /bin/sh

进入container,测试连接

##在 busybox1 里测试连接到 busybox2 and busybox3

# nslookup busybox2

--output--
Name: busybox2
Address: 192.168.0.2
busybox2.myOverlay
# nslookup busybox3 --output--
Name: busybox3
Address: 192.168.0.3 busybox3.myOverlay

OK,这次通信没有问题啦,看来真的是docker 的默认子网(10.0.0.0)与服务器(宿主机)上的IP段(10.xxx.xxx.xxx)冲突导致的问题。

所以我们的解决方案就是: 在创建 docker 子网的时候指定IP段

最后,感谢大家的关注,欢迎大家留言交流 :)

docker - 由于docker swarm子网与host机器网络冲突导致的container通信问题的解决方案的更多相关文章

  1. Docker 集群Swarm创建和Swarm Web管理

    关于Docker Swarm更多的介绍请查看<Docker管理工具-Swarm部署记录> 一.环境配置 1.安装环境 # cat /etc/redhat-release CentOS Li ...

  2. Docker管理工具 - Swarm部署记录

    之前介绍了Docker集群管理工具-Kubernetes部署记录,下面介绍另一个管理工具Swarm的用法,Swarm是Docker原生的集群管理软件,与Kubernetes比起来比较简单. Swarm ...

  3. Dockerfile & Docker Swarm & Docker Stack & Docker Compose

    Dockerfile 通俗地讲,它是为了指导单个镜像从无到有的构建过程.如果你镜像是从Docker registry上面拉下来的,那就用不到这个文件:如果你是自己的应用,想打包成镜像,那就需要这个文件 ...

  4. Docker 小记 — Compose & Swarm

    前言 任何相对完整的应用服务都不可能是由单一的程序来完成支持,计划使用 Docker 来部署的服务更是如此.大型服务需要进行拆分,形成微服务集群方能增强其稳定性和可维护性.本篇随笔将对 Docker ...

  5. Docker 入门之swarm部署web应用

    笔者近期在利用的docker搭建一个swarm集群,目前的应用还是入门级的,读者可自行根据自己的需要修改自己需要部署的应用,今天笔者介绍的是一个web应用的swarm集群的搭建.看这篇文章之前,我希望 ...

  6. Docker管理工具-Swarm

    一.Swarm介绍 Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机.Swarm使用标准的Doc ...

  7. Docker深入浅出系列 | Swarm多节点实战

    目录 前期准备 Swarm基本概念 什么是Docker Swarm 为什么要用Swarm Swarm的网络模型 Swarm的核心实现机制 服务发现机制 负载均衡机制Routing Mesh Docke ...

  8. docker入门3-docker swarm

    swarm介绍 想要将应用部署在一个集群并运行在多台机器上? 通过将多台机器链接到"Dockerized"集群以实现应用程序运行在多容器,多机器的技术被称为swarm. 一个swa ...

  9. DCOS实践分享(2):基于Docker Compose和Swarm的Docker化之路

    2016 年1 月 23 日,北京史上气温最低的一天. 在下午 1 点半的时候,由 DaoCloud 赞助的 2016 年度首次 Docker Meetup 准时开始. 在这次Meetup中,我分享了 ...

随机推荐

  1. 初学vitmio,vitmio的环境配置及遇到的坑

    1 到官网或者github下载vitamio 官网地址:https://www.vitamio.org/ github地址:https://github.com/yixia/VitamioBundle ...

  2. angular2/angular4 如何通过$http的post方法请求下载二进制的Excel文件

    时间有限,废话就不多说了,直接上干货! 下面给大家介绍一下我遇到的一个坑,如果你也遇到了,那恭喜你,你一定能找到答案:angular2/angular4 如何通过$http的post方法请求下载二进制 ...

  3. AppServ安装的一点小麻烦----

    好久,没装AppServ了,今天安装过程顺利,但是Apache,服务开启不了,页面也不能访问. 刚开始以为是版本下载错误了,先后换了N个版本,都不行. 在网上搜的过程中,偶然发现,一句话:64位系统, ...

  4. centos5.5下mangodb启动报错glibc

    mangodb启动报错glibc找不到(centos5.5) 报错形式 [root@test-172-16-0-139-ip mongodb-server]# /data/mongodb-server ...

  5. mysql数据导入方法

      1. 通过mysql-workbench的Data Import/Restore功能    1) 有的命令不支持,比如LOAD DATA LOCAL INFILE    2) 好处是可以和DB的模 ...

  6. Hibernate入门(一)

    一 Hibernate介绍 Hibernate 是一个开源.轻量级的ORM(对象关系映射)工具,该工具简化了数据创建.数据处理和数据访问,它是一种将对象映射到数据库中表的编程技术.ORM工具内部使用J ...

  7. SQL之删除触发器

    比如要删除的触发器名字叫dbo.test_trigger. 先判断这个触发器是否存在,判断存在后删除 if exists (select * from sysobjects where name = ...

  8. .net 4.0 中的特性总结(五):并行编程

    1.任务并行库 从 .NET Framework 4 开始,TPL 是编写多线程代码和并行代码的首选方法. 但是,并不是所有代码都适合并行化:例如,如果某个循环在每次迭代时只执行少量工作,或它在很多次 ...

  9. JavaWeb 环境搭建

    环境搭建 JDK7 Java基本开发工具包 安装(目录[不要使用中文和空格].JDK+JRE) 配置环境变量[JAVA_HOME.path.classpath] 2.        Tomcat7 提 ...

  10. 使用c#解析json库

    写了个c#版的json解析库,提供了json到hashtable以及hashtable到json字符串的转换 受惠于c#的语法特性,hashtable到json的解析变得非常简单 先判断传入的obje ...