背景

近期,公司网络要迁移到新的网段,所以原来在服务器上面搭建的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. Top 10 JavaScript编辑器,你在用哪个?

    对于JavaScript程序员来说,目前有很多很棒的工具可供选择.文本将会讨论10个优秀的支持JavaScript,HTML5和CSS开发,并且可以使用Markdown进行文档编写的文本编辑器.为什么 ...

  2. Elasticsearch文档查询

    简单数据集 到目前为止,已经了解了基本知识,现在我们尝试用更逼真的数据集,这儿已经准备好了一份虚构的JSON,关于客户银行账户信息的.每个文档的结构如下: { , , "firstname& ...

  3. grunt中常见的插件

    /** * 需要用到的文件夹有 js(src) css image html */ gulp是一种自动化构建工具,可以增强我们的工作流程,他是基于 Node.js 构建的,与gruntjs相比,gul ...

  4. Mac OS X 安装后的简单设置

    让Mac拥有类似apt-get的功能--安装Homebrew Homebrew是一个包管理器,用于在Mac上安装一些OS X没有的UNIX工具(比如著名的wget). 国内下载地址:http://ww ...

  5. IntelliJ IDEA的激活和汉化

    1.下载 IntelliJ IDEA 下载地址 Community 社区版,免费使用,下载后发现没有JAVA EE,推荐下载 Ultimate Ultimate 需要注册码. 2.激活 我下载的是20 ...

  6. ex2:逻辑回归及正则条件下的练习

    EX2 逻辑回归练习 ​ 假设你是一个大学某系的管理员,你想根据两项考试结果来确定每个申请人的录取机会.你有以前申请人的历史资料以作为逻辑回归的训练集.对于每一个训练集,你拥有每个申请人的两项考试的分 ...

  7. 性能测试常用sql技巧_Oracle

    做了一段时间的性能测试,把自己在性能测试过程中,使用到的Oracle中用到的sql语句整理一番,做个备忘: (1)多个字段以某种格式拼接 "||"字符串拼接符; 示例:将" ...

  8. 使用CoApp创建NuGet C++静态库包

    NuGet是微软开发平台下的包管理软件,使用它你可以非常方便的将一些第三方的库.框架整合进自己的项目中,省去了不少麻烦的配置过程.但是从官方文档上来看,貌似NuGet对C++的支持不是很好,并且在现阶 ...

  9. 【Python3之异常处理】

    一.错误和异常 1.错误 代码运行前的语法或者逻辑错误 语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) def test: ^ SyntaxError: inva ...

  10. Python基础-类

    Python基础-类 @(Python)[python, python基础] 写在前面 如非特别说明,下文均基于Python3 摘要 本文重点讲述如何创建和使用Python类,绑定方法与非绑定方法的区 ...