参考:https://yq.aliyun.com/articles/602107,修改其中的一个错误点。按照自己的方式整理的博文。


此时两台主机上的Docker容器如何直接通过IP地址进行通信?

一种直接想到的方案便是通过分别在各自主机中 添加路由 来实现两个centos容器之间的直接通信。

方案原理分析

由于使用容器的IP进行路由,就需要避免不同主机上的容器使用了相同的IP,为此我们应该为不同的主机分配不同的子网来保证。于是我们构造一下两个容器之间通信的路由方案,如下图所示。

各项配置如下:
• 主机1的IP地址为:192.168.18.162
• 主机2的IP地址为:192.168.18.141
• 为主机1上的Docker容器分配的子网:192.168.100.0/24
• 为主机2上的Docker容器分配的子网:192.168.200.0/24
这样配置之后,两个主机上的Docker容器就肯定不会使用相同的IP地址从而避免了IP冲突。
我们接下来 定义两条路由规则 即可:
• 所有目的地址为192.168.100.0/24的包都被转发到主机1上
• 所有目的地址为192.168.200.0/24的包都被转发到主机2上
综上所述,数据包在两个容器间的传递过程如下:
• 从container1 发往 container2 的数据包,首先发往container1的“网关”docker0,然后通过查找主机1的路由得知需要将数据包发给主机2,数据包到达主机2后再转发给主机2的docker0,最后由其将数据包转到container2中;反向原理相同,不再赘述。
我们心里方案想的是这样,接下来实践一下看看是否可行。

实际试验
• 1. 分别对主机1和主机2上的docker0进行配置
编辑主机1上的 /etc/docker/daemon.json 文件,添加内容:”bip” : “ip/netmask”

{ "bip":"192.168.100.252/24" }

编辑主机2上的 /etc/docker/daemon.json 文件,添加内容:”bip” : “ip/netmask”

{ "bip":"192.168.200.252/24" }

• 2. 重启docker服务
主机1和主机2上均执行如下命令重启docker服务以使修改后的docker0网段生效

systemctl restart docker

• 3. 添加路由规则
主机1上添加路由规则如下:

route add -net 192.168.200.0 netmask 255.255.255.0 gw 192.168.18.141

主机2上添加路由规则如下:

route add -net 192.168.100.0 netmask 255.255.255.0 gw 192.168.18.162

• 4. 配置iptables规则
主机1上添加如下规则:

iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 ! -d 192.168.0.0/16 -j MASQUERADE

主机2上添加如下规则:

iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -s 192.168.200.0/24 ! -d 192.168.0.0/16 -j MASQUERADE

• 5. 启动容器
主机1上启动centos容器:

docker run -it --name container1 centos /bin/bash

主机2上启动centos容器:

docker run -it --name container2 centos /bin/bash

• 分别在两台机器上安装ifconfig,并查看容器的ip,命令是:

[root@695ba390d221 /]# yum search ifconfig
[root@695ba390d221 /]# yum install net-tools.x86_64

主机1上的容器ip地址:

主机2上的容器ip:

• 6. 容器间直接通信
好了,现在两容器可以互ping了
主机1上ping:

主机2上ping:

Docker容器间通讯,直接路由方式实现网络通讯相关推荐

  1. Docker容器间网络通信

    自从Docker容器出现以来,容器网络通信就一直是被关注的焦点,也是生产环境的迫切需求.容器网络通信又分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信. 一.Docker单主机容器通信 基 ...

  2. Docker容器进入的4种方式

    Docker容器进入的4种方式 $ sudo docker ps $ sudo docker exec -it 775c7c9ee1e1 /bin/bash 在使用Docker创建了容器之后,大家比较 ...

  3. Docker 容器与宿主机网段冲突导致网络无法 ping 通的解决方案

    Docker 容器与宿主机网段冲突导致网络无法 ping 通的解决方案 参考文章: (1)Docker 容器与宿主机网段冲突导致网络无法 ping 通的解决方案 (2)https://www.cnbl ...

  4. docker容器网络配置之容器间的链接(默认桥接网络下的links)

    一. 遗留的容器连接方式  --link --link是docker 的一个遗留的特征,最终可能被删除.除非绝对需要使用,不然,建议使用 user-defined network 建立容器间的连接.不 ...

  5. docker 容器之间通信_还不清楚docker容器间是如何通信的?看这篇文章就够了

    如果觉得文章有帮助,欢迎点击头像关注我获取更多原创文章,同时也欢迎转发. 同时也可以在我的历史文章中找到Linux操作系统相关的服务器运维管理入门系列文章,欢迎交流. 前文演示docker容器内部数据 ...

  6. Docker的安装和使用及其Docker容器间通信,云计算技术与应用实验报告

    实验环境:Windows操作系统,阿里云资源,Docker 实验内容和要求:安装Docker并进行相关实验,熟悉Docker的相关操作.实验包括Docker的安装.镜像和容器的使用.容器的连接.容器间 ...

  7. Docker容器间的网络通信

    Docker Network 简单记录下容器间的网络通信. 文章目录 Docker Network ***网络驱动*** 网络驱动 network drivers是docker提供容器间网络通信的基础 ...

  8. java 网络通讯_JAVA编程实现TCP网络通讯的方法示例

    本文实例讲述了JAVA编程实现TCP网络通讯的方法.分享给大家供大家参考,具体如下: TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字 ...

  9. Docker容器间Link单向通信

    每创建一个容器,容器虚拟IP地址就会发生变化. docker run -d --name web tomcat# -it /bin/bash 为了让容器可见,默认创建后就退出了 docker run ...

最新文章

  1. re2正则表达式匹配引擎的c接口版本cre2的中文使用手册
  2. 4月30日或为上半年“最难打车日”
  3. 推动大数据和AI应用场景的落地,加速实现与产业融合。
  4. 用javascript实现一个stack overflow的例子
  5. php微框架 flight源码阅读
  6. cuda与tensorflow版本对应关系
  7. [转][ASP.net]后台页面刷新
  8. 算法导论第三版 第3章习题答案
  9. 虚拟机 Debian 11 安装moodle3.11
  10. 游戏开发中防外挂的那些事儿
  11. 毕业四年间,一壶漂泊,歌者默然(转帖)
  12. Android版本与SDK 版本对应关系
  13. px转vw和rem配置-vue-行内样式px转vw和rem-----项目中无需出现rem单位;
  14. 第六章 半导体存储器【微机原理】
  15. 一句话木马的工作原理
  16. 一种快速的幂运算方法(底数是自然数e,指数是浮点数)
  17. 国际期刊预警名单网址
  18. python猜数字小游戏制作
  19. 《学Unity的猫》——第九章:状态机与Unity协程,好奇猫与铁皮怪水管
  20. Will的替代词汇_59

热门文章

  1. python自动化办公:邮件篇 (定时邮件问候女票so easy)
  2. Java8 ThreadLocal 源码分析
  3. wxWidgets:wxScopedArray< T >类模板的用法
  4. wxWidgets:wxRichTextStyleListCtrl类用法
  5. wxWidgets:支持插件的程序
  6. boost::spirit模块实现自定义嵌入式容器数据的测试程序
  7. boost::sort模块实现带有右移函子排序示例的整数排序的测试程序
  8. boost::math::chebyshev_transform用法的测试程序
  9. GDCM:gdcm::Curve的测试程序
  10. boost::container_hash模块实现哈希信息