2台主机的docker互相通信的方法
主机清单:
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互相通信的方法相关推荐
- 6 实现多主机间 Docker 容器通信
目录 1 iptables简介 1.1 基本操作指令 1.2 iptables 工作流程 2 实现多主机间Docker容器通信 2.1 目标 2.2 操作步骤总结 2.3 具体操作步骤 1 iptab ...
- 一些计算两台主机之间进行socket通信的延迟的小程序
最后更新于2021年6月1日 11:06:11 2021年5月26日 16:44:07:HTTP.TCP和Socket的概念和原理及其区别 iPerf图形化工具Jperf图文使用教程 Measurin ...
- 以两台Linux主机在docker中实现mysql主主备份以用nginx实现mysql高可用
使用nginx反向代理主主备份的两台mysql,连接时连接nginx,当其中一台myql停止后,仍然可以正常使用,如果使用k8s 会简单许多.所谓主主复制就是在主从复制的基础上掉了个头. 请博主买块糖 ...
- 检查两台主机是否同处于一个局域网
一般来说,在校园的情况下,实验室服务器和宿舍/工位的主机在同一个局域网内,对外有相同的外网IP地址,对内有不同的内网IP地址,基于此可以通过ssh/安全外壳协议连接两台主机,并进行通信:远程调试代码. ...
- 如何确定两台主机是否在同一个网段?
举例说明: 已知A.B两台主机的IP地址和子网掩码,判断他们是否在同一个网段. A:192.168.1.1/24 B:192.168.1.33/27 判断两台主机是否在同一个网段的方法: 用 ...
- 【网络通信与信息安全】之深入解析两台主机之间的通信过程和原理
一.前言 本文通过在 Docker 容器中执行命令,来深入了解两台主机之间的通信过程.阅读完本文,您将熟悉以下内容: Docker 的基本操作: 创建 socket 并发送 HTTP 请求: 路由表. ...
- Docker原生网络、自定义网络、Docker容器通信、跨主机容器网络
Docker原生网络.自定义网络.Docker容器通信.跨主机容器网络 Docker原生网络 bridge Host none Docker自定义网络 自定义bridge overlay macvia ...
- [计算机网络试题]某子网的子网掩码为255.255.255.224,那么,选项中的四台主机中,不能与其它三台正常通信的是_
[作者:杨景文] 题目1 某子网的子网掩码为255.255.255.224,那么,选项中的四台主机中,不能与其它三台正常通信的是() A. 202.3.1.33 B. 202.3.1.65 C. 20 ...
- 计算机网络两台主机互相通信过程概览
两台主机互通过程: 地面:物理层信息 路 :数据链路层 使物理层更好的传输 车 :网络层 实现异构网络的互联 货物:传输层 实现不同主机的进程之间的通讯(TCP) 楼:应用层 为应用进程提供服务 TC ...
最新文章
- Nginx的常用配置项
- Windows 窗体多线程
- inline-block的兼容性问题
- The operation could not be performed because OLE DB provider SQLNCLI11 for linked server SDSSDFCC...
- Java 面向对象编程 tricks
- Exchange Server 2010 SP1的安装(二)建立发送连接器
- Java在线反编译网站
- MAC常用终端命令行
- C#检测ocx控件是否注册
- 超像素池化弱监督语义分割
- IDEA类图标有小叉叉×
- NVIDIA Jetson TX2简介
- Dynamic CRM 2016 IFD配置(1)证书颁发机构配置
- 如何给WORD文档添加外边框,教程在这里,WORD页面外边框怎么添加
- Python简单爬取起点中文网小说(仅学习)
- EZEMC测试软件_什么是EMC测试
- python怎样使用各个日期赤纬_科学网—PyEphem基本功能介绍 - 张金龙的博文
- MATLAB代码:基于雨流计数法的源-荷-储双层协同优化配置
- WebRTC基础实践 - 5.通过RTCPeerConnection传输流媒体视频
- 从输入url到页面渲染完成经历的那些事~
热门文章
- si_meminfo获取当前系统物理内存使用情况
- linux 字符设备驱动cdev
- python正则匹配表达式(2)
- ModuleNotFoundError: No module named 'CommandNotFound'
- Gated Convolution
- eof在c语言中表示什么_日语中的鍵为什么既能表示“钥匙”也能表示“锁”?...
- vue实现数字“滚动式增加”效果 【插件化封装】
- git head指向老版本_Git最全总结
- Typecho浅色三栏主题
- 小程序 | 微信小程序二级选择器