docker - 由于docker swarm子网与host机器网络冲突导致的container通信问题的解决方案
背景
近期,公司网络要迁移到新的网段,所以原来在服务器上面搭建的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通信问题的解决方案的更多相关文章
- Docker 集群Swarm创建和Swarm Web管理
关于Docker Swarm更多的介绍请查看<Docker管理工具-Swarm部署记录> 一.环境配置 1.安装环境 # cat /etc/redhat-release CentOS Li ...
- Docker管理工具 - Swarm部署记录
之前介绍了Docker集群管理工具-Kubernetes部署记录,下面介绍另一个管理工具Swarm的用法,Swarm是Docker原生的集群管理软件,与Kubernetes比起来比较简单. Swarm ...
- Dockerfile & Docker Swarm & Docker Stack & Docker Compose
Dockerfile 通俗地讲,它是为了指导单个镜像从无到有的构建过程.如果你镜像是从Docker registry上面拉下来的,那就用不到这个文件:如果你是自己的应用,想打包成镜像,那就需要这个文件 ...
- Docker 小记 — Compose & Swarm
前言 任何相对完整的应用服务都不可能是由单一的程序来完成支持,计划使用 Docker 来部署的服务更是如此.大型服务需要进行拆分,形成微服务集群方能增强其稳定性和可维护性.本篇随笔将对 Docker ...
- Docker 入门之swarm部署web应用
笔者近期在利用的docker搭建一个swarm集群,目前的应用还是入门级的,读者可自行根据自己的需要修改自己需要部署的应用,今天笔者介绍的是一个web应用的swarm集群的搭建.看这篇文章之前,我希望 ...
- Docker管理工具-Swarm
一.Swarm介绍 Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机.Swarm使用标准的Doc ...
- Docker深入浅出系列 | Swarm多节点实战
目录 前期准备 Swarm基本概念 什么是Docker Swarm 为什么要用Swarm Swarm的网络模型 Swarm的核心实现机制 服务发现机制 负载均衡机制Routing Mesh Docke ...
- docker入门3-docker swarm
swarm介绍 想要将应用部署在一个集群并运行在多台机器上? 通过将多台机器链接到"Dockerized"集群以实现应用程序运行在多容器,多机器的技术被称为swarm. 一个swa ...
- DCOS实践分享(2):基于Docker Compose和Swarm的Docker化之路
2016 年1 月 23 日,北京史上气温最低的一天. 在下午 1 点半的时候,由 DaoCloud 赞助的 2016 年度首次 Docker Meetup 准时开始. 在这次Meetup中,我分享了 ...
随机推荐
- 执行ANT JAVA三种方式
1. 命令行 <target name="reporttoexcel" depends="report"> <exec executable= ...
- c# networkcomms 3.0实现模拟登陆总结
最近项目需要做一个客户查询状态系统,当前上位机缺少服务功能,于是找到了networkcomms 开源框架,作为项目使用. 最新版networkcomms 下载地址:https://github.com ...
- Idea 常用功能汇总,工作中常用技巧
1.隐藏没用到的文件 比如 IDEA 的项目配置文件(.iml 和.idea),打开 Settings-File Types, 加入要隐藏的文件后缀. 2.常用技巧 2.1 通过Alt+F8查看变量 ...
- 出位的template.js 基于jquery的模板渲染插件
找了好几款基于jquery的模板渲染插件,无一感觉很难用(教程较少.绑定不统一),也可能我智商问题,比如jquery template.js .jtemplate.js. 然后在github上找到这一 ...
- PHPCMS V9里加入JS时生成首页出错
有次在首页中加入JS,确认JS没有问题,但是在后台生成首页的时候一直出错. 查了半天才发现原来是JS里的“{}”问题,V9里调用内容也是用的大括号,冲突了. 解决方法是在“{”前面和后面分别加一个空格 ...
- java 读取excel
1. 需要下载jxl.jar包 自己研究了一下,代码如下 package file;import java.io.File;import java.io.IOException;import java ...
- OpenCV学习2-----使用inpaint函数进行图像修复
安装opencv时,在opencv的安装路径下, sources\samples\cpp\ 路径里面提供了好多经典的例子,很值得学习. 这次的例子是利用inpaint函数进行图像修复. CV_EXP ...
- 【LeetCode】233. Number of Digit One
题目: Given an integer n, count the total number of digit 1 appearing in all non-negative integers les ...
- form表单的ajax验证2
form表单的ajax验证2: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...
- 如何连接远程redis,并且选择某个库进行操作
public static Jedis getJedis(){ Jedis jedis = new Jedis("222.201.145.215"); jedis.select(1 ...