专栏首页用户3749098的专栏Docker容器跨主机通信之:直接路由方式

Docker容器跨主机通信之:直接路由方式

概述

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

注: 本文首发于 My 公众号 CodeSheep ,可 长按 或 扫描 下面的 小心心 来订阅 ↓ ↓ ↓

CodeSheep · 程序羊

情景构造

如下图所示,我们有两个物理主机1和主机2,我们在各自宿主机上启动一个centos容器,启动成功之后,两个容器分别运行在两个宿主机之上,默认的IP地址分配如图所示,这也是Docker自身默认的网络。

两台主机上的容器如何通信?

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

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

方案原理分析

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

容器间通信

各项配置如下:

主机1的IP地址为:192.168.145.128

主机2的IP地址为:192.168.145.129

为主机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中;反向原理相同,不再赘述。

我们心里方案想的是这样,接下来实践一下看看是否可行。

实际试验

0x01. 分别对主机1和主机2上的docker0进行配置

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

{ "bip", "172.17.1.252/24" }

1

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

{ "bip", "172.17.2.252/24" }

1

0x02. 重启docker服务

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

systemctl restart docke

1

0x03. 添加路由规则

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

route add -net 172.17.2.0 netmask 255.255.255.0 gw 192.168.145.129

1

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

route add -net 172.17.1.0 netmask 255.255.255.0 gw 192.168.145.128

1

0x04. 配置iptables规则

主机1上添加如下规则:

iptables -t nat -F POSTROUTING

iptables -t nat -A POSTROUTING -s 172.17.1.0/24 ! -d 172.17.0.0/16 -j MASQUERADE

1

2

主机2上添加如下规则:

iptables -t nat -F POSTROUTING

iptables -t nat -A POSTROUTING -s 172.17.2.0/24 ! -d 172.17.0.0/16 -j MASQUERADE

1

2

0x05. 启动容器

主机1上启动centos容器:

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

1

主机2上启动centos容器:

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

1

0x06. 容器间直接通信

好了,现在两容器可以互ping了

container1 ping container2

container2 ping container1

后记

本文探讨了局域网中不同宿主机间Docker容器直接通信的一种可能方案。当然现在实现跨主机容器间通信的现成方案也很多,典型的比如flannel这种,我的 个人私有云 也用的是这种方案。

————————————————

版权声明:本文为CSDN博主「CodeSheep程序羊」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/wangshuaiwsws95/article/details/80687384

原文链接:https://blog.csdn.net/wangshuaiwsws95/article/details/80687384

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Docker容器跨主机通信之:直接路由方式

    直观上看,要实现网络通信,机器需要至少一个网络接口(物理接口或虚拟接口)与外界相通,并可以收发数据包;此外,如果不同子网之间要进行通信,需要额外的路由机制。

    py3study
  • Docker容器跨主机通信之:OVS+GRE

    OpenVSwich即开放式虚拟交换机实现,简称OVS,OVS在云计算领域应用广泛,值得我们去学习使用。

    py3study
  • Docker容器跨主机通讯的几种方式

    此时docker引擎会创建一个veth对,一端连接到容器实例并命名为eth0,另一端连接到指定的网桥中(比如docker0),因此同在一个主机的容器实例由于连接...

    1850810
  • Docker 容器跨主机多网段通信解决方案

    一、MacVlan 实现Docker的跨主机网络通信的方案有很多,如之前博文中写到的通过部署 Consul服务实现Docker容器跨主机通信

    小手冰凉
  • Docker容器学习梳理--容器间网络通信设置(Pipework和Open vSwitch)

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

    洗尽了浮华
  • docker bridge 到 k8s pod 跨节点网络通信机制演进

    2020 还没来得及品味就即将过去一个季度,愿剩下的时光不被辜负。进入正题,docker container是单进程模式,能够解决一些单一的问题,在现实中,我们...

    用户5166556
  • Docker跨主机网络——overlay

    前言 在Docker网络——单host网络一文中,我为大家总结了Docker的单机网络相关知识和操作,单机网络比较容易。本文我为大家总结Docker跨主机通信相...

    魏守峰
  • 初学Docker容器网络不得不看的学习笔记

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。

    宜信技术学院
  • K8s网络模型

    容器不是模拟一个完整的操作系统,而是对进程进行隔离,对容器里的进程来说它接触到的各种资源都是独享的,比虚拟机启动快、占用资源少。

    冬夜先生
  • Docker 跨主机网络方案分析

    猿大白
  • Docker网络——实现容器间通信、容器与外网通信以及容器的跨主机访问

    由上图我们可以看到创建的网络ID为4554d78082da ,使用ip addr查看本机网络:

    1850810
  • 037.集群网络-Docker网络实现

    在Kubernetes管理模式下通常只会使用bridge模式,如下介绍在bridge模式下Docker是如何支持网络的。

    木二
  • 一文看懂Flannel-UDP在kubernetes中如何工作

    Kubernetes是用于大规模管理容器化应用程序出色的编排工具。但是,您可能知道,使用kubernetes并非易事,尤其是后端网络实现。我在网络中遇到了许多问...

    公众号: 云原生生态圈
  • flannel跨主网络通信方案(UDP、VXLAN、HOST-GW)详解

    坚持看下去,文末送机械键盘一个 本文中,笔者主要结合自己使用flannel心得,以及flannel的技术演进,介绍下flannel网络实现方案。在没有介绍fla...

    用户5166556
  • Docker网络解决方案-Weave部署记录

    前面说到了Flannel的部署,今天这里说下Docker跨主机容器间网络通信的另一个工具Weave的使用。当容器分布在多个不同的主机上时,这些容器之间的相互通信...

    洗尽了浮华
  • Docker的网络模式bridge、host、container other、overlay

    docker run创建Docker容器时,可以用--net选项指定容器的网络模式,Docker有以下5种网络模式: bridge模式:使用–net =bri...

    菲宇
  • docker 学习资料收集

    docker镜像怎么迁移到其他的服务器 http://www.talkwithtrend.com/Question/123589

    用户1177503
  • 理解Docker跨多主机容器网络

    将宿主机A的端口P映射到容器C的网络空间监听的端口P’上,仅提供四层及以上应用和服务使用。这样其他主机上的容器通过访问宿主机A的端口P实 现与容器C的通信。显然...

    Rainbond开源
  • 理解Docker跨多主机容器网络

    Rainbond开源

扫码关注云+社区

领取腾讯云代金券