Docker容器间通讯直接路由方式实现网络通讯

 更新时间:2019年02月15日 10:33:47   作者:codesheep  
今天小编就为大家分享一篇关于Docker容器间通讯直接路由方式实现网络通讯,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

概述

就目前Docker自身默认的网络来说,单台主机上的不同Docker容器可以借助docker0网桥直接通信,这没毛病,而不同主机上的Docker容器之间只能通过在主机上用映射端口的方法来进行通信,有时这种方式会很不方便,甚至达不到我们的要求,因此位于不同物理机上的Docker容器之间直接使用本身的IP地址进行通信很有必要。再者说,如果将Docker容器起在不同的物理主机上,我们不可避免的会遭遇到Docker容器的跨主机通信问题。本文就来尝试一下。

此时两台主机上的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磁盘空间不足问题

    解决docker磁盘空间不足问题

    这篇文章主要介绍了解决docker磁盘空间不足问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Docker开启远程连接并实现安全通信详解

    Docker开启远程连接并实现安全通信详解

    这篇文章主要为大家介绍了Docker开启远程连接并实现安全通信过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 在CentOS 7 上为docker配置端口转发以兼容firewall的解决方法

    在CentOS 7 上为docker配置端口转发以兼容firewall的解决方法

    这篇文章主要介绍了在CentOS 7 上为docker配置端口转发以兼容firewall的解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Docker容器备份的常用方法总结

    Docker容器备份的常用方法总结

    容器化技术已经成为现代应用开发和部署的核心组成部分,而 Docker 作为最流行的容器平台,承载着越来越多的关键业务,在这些环境中,确保容器数据的安全性和可恢复性至关重要,本文给大家介绍了Docker容器备份的常用方法,需要的朋友可以参考下
    2025-08-08
  • docker-compose命令如何删除image的镜像

    docker-compose命令如何删除image的镜像

    这篇文章主要介绍了docker-compose命令如何实现删除image的镜像方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • 使用Docker安装Jenkins的示例代码

    使用Docker安装Jenkins的示例代码

    这篇文章主要介绍了使用Docker安装Jenkins的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • docker通过sbom获取组件版本和漏洞编号的方法

    docker通过sbom获取组件版本和漏洞编号的方法

    本文主要介绍了docker通过sbom获取组件版本和漏洞编号的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-05-05
  • 低版本Docker升级高版本Docker的详细教程及成功避坑

    低版本Docker升级高版本Docker的详细教程及成功避坑

    如果我们使用docker来管理容器,那么保持docker引擎的更新将会是十分重要的,下面这篇文章主要给大家介绍了关于低版本Docker升级高版本Docker的详细教程及成功避坑,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • 使用Docker部署Python Flask应用的完整教程

    使用Docker部署Python Flask应用的完整教程

    Docker是一种开源的容器化平台,可以将应用程序及其依赖项打包成一个独立的容器,实现快速部署和跨平台运行,本文将详细介绍如何使用Docker来部署Python Flask应用程序,帮助开发者更高效地构建和部署应用,需要的朋友可以参考下
    2024-06-06
  • Docke实例之搭建gitlab的方法

    Docke实例之搭建gitlab的方法

    本篇文章主要介绍了Docke实例之搭建gitlab的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03

最新评论