主机清单:

192.168.6.132 主机名 vm132 系统centos7

192.168.6.132 主机名 vm132 系统centos7

安装docker

wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.cloud.tencent.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
yum makecache fast
yum install docker-ce  -y

给2台主机配置不同的网段

192.168.6.132 (vm132)的/etc/docker/daemon.json增加如下配置

{"bip": "172.17.132.1/24",......
}

192.168.6.136 (vm136)的/etc/docker/daemon.json增加如下配置

{"bip": "172.17.136.1/24",......
}

重启docker服务 sudo systemctl restart docker

docker访问外网原理解析

在任意一台主机执行:

[root@vm132 ~]# docker run  -itd --name alpine  alpine   #启动一个alpine容器
[root@vm132 ~]# docker exec  -it alpine sh                #进入容器
/ # ping baidu.com                                        #在容器内ping百度是可以ping通的
PING baidu.com (39.156.69.79): 56 data bytes
64 bytes from 39.156.69.79: seq=0 ttl=127 time=43.406 ms

为什么可以ping通百度呢

[root@vm132 ~]# iptables -t nat  -L -n
...省略
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.132.0/24      0.0.0.0/0
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0
...省略

查看iptables的nat表发现来源是容器网段的IP在访问时做了SNAT,类似于局域网访问外网(如:百度)。

docker(172.17.132.2)访问外网的过程如下(做了SNAT):
包出vm132时做了SNAT,  SNAT之后包的源地址就是vm132的IP
包出路由器时又做了SNAT, SNAT之后包的源地址就是路由器的公网IP包回到路由器时,根据路由器的conntrack(链接跟踪表),把包的目的IP修改为vm132的IP(因为包出vm132时做了SNAT源IP从docker修改为vm132的IP)
包回到vm132时,根据vm132的conntrack(链接跟踪表),把包的目的IP修改为docker的IP。整体通讯过程打通
如果docker访问外网不做SNAT,流程是这样的。
包出vm132时没做SNAT,  包的源地址就是172.17.132.2
包出路由器时做了SNAT, SNAT之后包的源地址就是路由器的公网IP  (源IP从172.17.132.2修改为路由器公网IP)包回到路由器时,根据路由器的conntrack(链接跟踪表),把包的目的IP修改为docker的IP。
此时路由器懵了,他只知道各主机的IP,不知道docker的IP在哪儿。通讯失败

查看主机路由表

[root@vm132 ~]# route -n
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.6.2     0.0.0.0         UG    0      0        0 ens33
172.17.132.0    0.0.0.0         255.255.255.0   U     0      0        0 docker0
192.168.6.0     0.0.0.0         255.255.255.0   U     0      0        0 ens33

如果vm132主机的docker要跟vm136主机的docker通讯,目的地址是172.17.136.0/24网段,因此需要按如下命令修改路由表内容。为保证2台服务器的docker容器可以互相通讯,vm132和vm136的主机各增加了一条路由表信息。意思时:目的IP如果是对方主机的docker,把网关设置为对方主机。

vm132服务器执行下面的命令:
[root@vm132 ~]# route add -net  172.17.136.0/24  gw 192.168.6.136vm136服务器执行下面的命令:
[root@vm136 ~]# route add -net  172.17.132.0/24  gw 192.168.6.132

思考:如果只是让2台主机的docker可以通讯,iptables的SNAT需要吗?
答案:不需要。用SNAT的原因是包回来的时候不知道找谁,上面2条路由信息可以让2台服务器的容器互相找到对方,是不需要SNAT的。

但是如果docker需要访问外网,SNAT是需要的,对应的iptables规则也需要保留。

清除iptables规则,修改默认规则为ACCEPT

2台主机同时操作,命令如下:

iptables   -F
iptables  -t  nat  -F然后检查有没有默认规则不对的,如有默认规则不是ACCEPT,修改一下,如:
iptables  -P FORWARD  ACCEPT

2台主机的docker此时已经可以互相通信了

各位自己试

思考:

1、如果2台主机也不在同一网段,主机间的docker要通讯,需要做SNAT不?
2、局域网内k8s中2台主机的docker互相访问如果做了SNAT,容器的日志记录的是各主机的IP合适吗?该怎么办才能使得日志记录的是容器IP。

2台主机的docker互相通信的方法相关推荐

  1. 6 实现多主机间 Docker 容器通信

    目录 1 iptables简介 1.1 基本操作指令 1.2 iptables 工作流程 2 实现多主机间Docker容器通信 2.1 目标 2.2 操作步骤总结 2.3 具体操作步骤 1 iptab ...

  2. 一些计算两台主机之间进行socket通信的延迟的小程序

    最后更新于2021年6月1日 11:06:11 2021年5月26日 16:44:07:HTTP.TCP和Socket的概念和原理及其区别 iPerf图形化工具Jperf图文使用教程 Measurin ...

  3. 以两台Linux主机在docker中实现mysql主主备份以用nginx实现mysql高可用

    使用nginx反向代理主主备份的两台mysql,连接时连接nginx,当其中一台myql停止后,仍然可以正常使用,如果使用k8s 会简单许多.所谓主主复制就是在主从复制的基础上掉了个头. 请博主买块糖 ...

  4. 检查两台主机是否同处于一个局域网

    一般来说,在校园的情况下,实验室服务器和宿舍/工位的主机在同一个局域网内,对外有相同的外网IP地址,对内有不同的内网IP地址,基于此可以通过ssh/安全外壳协议连接两台主机,并进行通信:远程调试代码. ...

  5. 如何确定两台主机是否在同一个网段?

    举例说明: 已知A.B两台主机的IP地址和子网掩码,判断他们是否在同一个网段. A:192.168.1.1/24      B:192.168.1.33/27 判断两台主机是否在同一个网段的方法: 用 ...

  6. 【网络通信与信息安全】之深入解析两台主机之间的通信过程和原理

    一.前言 本文通过在 Docker 容器中执行命令,来深入了解两台主机之间的通信过程.阅读完本文,您将熟悉以下内容: Docker 的基本操作: 创建 socket 并发送 HTTP 请求: 路由表. ...

  7. Docker原生网络、自定义网络、Docker容器通信、跨主机容器网络

    Docker原生网络.自定义网络.Docker容器通信.跨主机容器网络 Docker原生网络 bridge Host none Docker自定义网络 自定义bridge overlay macvia ...

  8. [计算机网络试题]某子网的子网掩码为255.255.255.224,那么,选项中的四台主机中,不能与其它三台正常通信的是_

    [作者:杨景文] 题目1 某子网的子网掩码为255.255.255.224,那么,选项中的四台主机中,不能与其它三台正常通信的是() A. 202.3.1.33 B. 202.3.1.65 C. 20 ...

  9. 计算机网络两台主机互相通信过程概览

    两台主机互通过程: 地面:物理层信息 路 :数据链路层 使物理层更好的传输 车 :网络层 实现异构网络的互联 货物:传输层 实现不同主机的进程之间的通讯(TCP) 楼:应用层 为应用进程提供服务 TC ...

最新文章

  1. Nginx的常用配置项
  2. Windows 窗体多线程
  3. inline-block的兼容性问题
  4. The operation could not be performed because OLE DB provider SQLNCLI11 for linked server SDSSDFCC...
  5. Java 面向对象编程 tricks
  6. Exchange Server 2010 SP1的安装(二)建立发送连接器
  7. Java在线反编译网站
  8. MAC常用终端命令行
  9. C#检测ocx控件是否注册
  10. 超像素池化弱监督语义分割
  11. IDEA类图标有小叉叉×
  12. NVIDIA Jetson TX2简介
  13. Dynamic CRM 2016 IFD配置(1)证书颁发机构配置
  14. 如何给WORD文档添加外边框,教程在这里,WORD页面外边框怎么添加
  15. Python简单爬取起点中文网小说(仅学习)
  16. EZEMC测试软件_什么是EMC测试
  17. python怎样使用各个日期赤纬_科学网—PyEphem基本功能介绍 - 张金龙的博文
  18. MATLAB代码:基于雨流计数法的源-荷-储双层协同优化配置
  19. WebRTC基础实践 - 5.通过RTCPeerConnection传输流媒体视频
  20. 从输入url到页面渲染完成经历的那些事~

热门文章

  1. si_meminfo获取当前系统物理内存使用情况
  2. linux 字符设备驱动cdev
  3. python正则匹配表达式(2)
  4. ModuleNotFoundError: No module named 'CommandNotFound'
  5. Gated Convolution
  6. eof在c语言中表示什么_日语中的鍵为什么既能表示“钥匙”也能表示“锁”?...
  7. vue实现数字“滚动式增加”效果 【插件化封装】
  8. git head指向老版本_Git最全总结
  9. Typecho浅色三栏主题
  10. 小程序 | 微信小程序二级选择器