Docker容器跨主机通信之:直接路由方式
概述
就目前Docker自身默认的网络来说,单台主机上的不同Docker容器可以借助docker0网桥直接通信,这没毛病,而不同主机上的Docker容器之间只能通过在主机上用映射端口的方法来进行通信,有时这种方式会很不方便,甚至达不到我们的要求,因此位于不同物理机上的Docker容器之间直接使用本身的IP地址进行通信很有必要。再者说,如果将Docker容器起在不同的物理主机上,我们不可避免的会遭遇到Docker容器的跨主机通信问题。本文就来尝试一下。
情景构造
如下图所示,我们有两个物理主机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" }
编辑主机2上的 /etc/docker/daemon.json
文件,添加内容:"bip" : "ip/netmask"
{ "bip", "172.17.2.252/24" }
- 0x02. 重启docker服务
主机1和主机2上均执行如下命令重启docker服务以使修改后的docker0网段生效
systemctl restart docker
- 0x03. 添加路由规则
主机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
- 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
主机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
- 0x05. 启动容器
主机1上启动centos容器:
docker run -it --name container1 centos /bin/bash
主机2上启动centos容器:
docker run -it --name container2 centos /bin/bash
- 0x06. 容器间直接通信
好了,现在两容器可以互ping了
后记
本文探讨了局域网中不同宿主机间Docker容器直接通信的一种可能方案。当然现在实现跨主机容器间通信的现成方案也很多,典型的比如flannel这种,我的 个人私有云 也用的是这种方案。
如果有兴趣,也可以抽点时间看看作者一些关于容器化、微服务化方面的文章:
- Docker容器可视化监控中心搭建
- 利用ELK搭建Docker容器化应用日志中心
- 利用K8S技术栈打造个人私有云系列连载文章
- Spring Boot应用监控实战
- RPC框架实践之:Google gRPC
- RPC框架实践之:Apache Thrift
- 微服务调用链追踪中心搭建
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Kubernetes存储原理
导语: Docker容器的设计原理是当容器消融时,容器内的存储也随之消失,但是实际情况中有很多是需要进行持久化的存储的,所以也很有必要进行Kubernetes持久化存储的概念说明。 Kubernetes存储组成 1.本地化的存储 2.网络化的存储 3.其他特殊存储 本地化的存储 ①EmptyDir,EmptyDir是一个空目录,其的生命周期和所属的Pod是完全一致的。EmptyDir的用处是可以在同一 Pod 内的不同容器之间共享工作过程中产生的文件。缺省情况下,EmptyDir 是使用主机磁盘进行存储的,也可以设置emptyDir.medium 字段的值为Memory,来提高运行速度,但是这种设置,对该卷的占用会消耗容器的内存份额。 ②HostPath,HostPath存储会把宿主机上的指定卷加载到容器之中,如果Pod发生跨主机的重建,其内容就难保证了。一般是用于本地化的日志存储。 网络化的存储 Kubernetes网络存储是学习的重点,Kubernetes支持为数众多的云提供商和网络存储方案。各种支持的方式不尽相同,例如 GlusterFS 需要创建 Endpoint,Ceph/N...
- 下一篇
Kubeflow实战系列: 利用TFJob运行分布式TensorFlow
介绍 本系列将介绍如何在阿里云容器服务上运行Kubeflow, 本文介绍如何使用TfJob运行分布式模型训练。 第一篇:阿里云上使用JupyterHub 第二篇:阿里云上小试TFJob 第三篇:利用TFJob运行分布式TensorFlow 第四篇:利用TFJob导出分布式TensorFlow模型 第五篇:利用TensorFlow Serving进行模型预测 TensorFlow分布式训练和Kubernetes TensorFlow作为现在最为流行的深度学习代码库,在数据科学家中间非常流行,特别是可以明显加速训练效率的分布式训练更是杀手级的特性。但是如何真正部署和运行大规模的分布式模型训练,却成了新的挑战。 实际分布式TensorFLow的使用者需要关心3件事情。 寻找足够运行训练的资源,通常一个分布式训练需要若干数量的worker(运算服务器)和p
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8编译安装MySQL8.0.19
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Thymeleaf,官方推荐html解决方案