Docker容器跨主机通信
如下图所示,我们有两个物理主机1和主机2,我们在各自宿主机上启动一个CentOS的Linux容器,启动成功之后,两个容器分别运行在两个宿主机之上,默认的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冲突。
我们接下来定义两条路由规则即可:
从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
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
5、启动容器
主机1上启动CentOS Linux容器:
docker run -it --name container1 centos /bin/bash
主机2上启动CentOS Linux容器:
docker run -it --name container2 centos /bin/bash
6、容器间直接通信实验
好了,现在可以尝试一下两个容器间是否可以互ping了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)