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

概述

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

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

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

方案原理分析

由于使用容器的IP进行路由,就需要避免不同主机上的容器使用了相同的IP,为此我们应该为不同的主机分配不同的子网来保证。

各项配置如下:

  • 主机1的IP地址为:192.168.1.3

  • 主机2的IP地址为:192.168.1.4

  • 为主机1上的Docker容器分配的子网:172.17.1.0/24

  • 为主机2上的Docker容器分配的子网:172.17.2.0/24

这样配置之后,两个主机上的Docker容器就肯定不会使用相同的IP地址从而避免了IP冲突。

我们接下来 定义两条路由规则 即可:

  • 所有目的地址为172.17.1.0/24的包都被转发到主机1上

  • 所有目的地址为172.17.2.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", "172.17.1.252/24" }

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

{ "bip", "172.17.2.252/24" }
  • 2. 重启docker服务

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

systemctl restart docker
  • 3. 添加路由规则

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

route add -net 172.17.2.0 netmask 255.255.255.0 gw 192.168.145.129

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

route add -net 172.17.1.0 netmask 255.255.255.0 gw 192.168.145.128
4. 配置iptables规则

主机1上添加如下规则:

iptables -t nat -F POSTROUTING  #清理NATPOSTROUTING转发表
iptables -t nat -A POSTROUTING -s 172.17.1.0/24 ! -d 172.17.0.0/16 -j MASQUERADE
#对源 IP 为 172.17.1.0/24 ,目标 IP 不为 172.17.0.0/16 的数据包做 IP 伪装,伪装成接口的第一个 IP(即是host1的物理网卡地址)

主机2上添加如下规则:

iptables -t nat -F POSTROUTING  #清理NATPOSTROUTING转发表
iptables -t nat -A POSTROUTING -s 172.17.2.0/24 ! -d 172.17.0.0/16 -j MASQUERADE
#对源 IP 为 172.17.2.0/24 ,目标 IP 不为 172.17.0.0/16 的数据包做 IP 伪装,伪装成接口的第一个 IP(即是host1的物理网卡地址)
  • 5. 启动容器

主机1上启动centos容器:

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

主机2上启动centos容器:

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

ifconfig查看IP信息:

如果没有该命令需要执行安装命令: yum install net-tools -y

  • 6. 容器间直接通信

 

 

数据包流程:c1-->host1 docker0-->host1 eth网卡-->host2 eth网卡-->host2 docker0-->c2


 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值