就目前Docker自身默认的网络来讲,单台主机上的不一样Docker容器能够借助docker0网桥直接通讯,这没毛病,而不一样主机上的Docker容器之间只能经过在主机上用映射端口的方法来进行通讯,有时这种方式会很不方便,甚至达不到咱们的要求,所以位于不一样物理机上的Docker容器之间直接使用自己的IP地址进行通讯颇有必要。再者说,若是将Docker容器起在不一样的物理主机上,咱们不可避免的会遭遇到Docker容器的跨主机通讯问题。本文就来尝试一下。docker
注: 本文首发于 My 公众号 CodeSheep ,可 长按 或 扫描 下面的 当心心 来订阅 ↓ ↓ ↓
以下图所示,咱们有两个物理主机1和主机2,咱们在各自宿主机上启动一个centos容器,启动成功以后,两个容器分别运行在两个宿主机之上,默认的IP地址分配如图所示,这也是Docker自身默认的网络。编程
此时两台主机上的Docker容器如何直接经过IP地址进行通讯?json
一种直接想到的方案即是经过分别在各自主机中 添加路由 来实现两个centos容器之间的直接通讯。咱们来试试吧c#
因为使用容器的IP进行路由,就须要避免不一样主机上的容器使用了相同的IP,为此咱们应该为不一样的主机分配不一样的子网来保证。因而咱们构造一下两个容器之间通讯的路由方案,以下图所示。centos
各项配置以下:bash
这样配置以后,两个主机上的Docker容器就确定不会使用相同的IP地址从而避免了IP冲突。服务器
咱们接下来 定义两条路由规则 便可:网络
综上所述,数据包在两个容器间的传递过程以下:框架
咱们内心方案想的是这样,接下来实践一下看看是否可行。微服务
编辑主机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" }
主机1和主机2上均执行以下命令重启docker服务以使修改后的docker0网段生效
systemctl restart docker
主机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
主机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
主机1上启动centos容器:
docker run -it --name container1 centos /bin/bash
主机2上启动centos容器:
docker run -it --name container2 centos /bin/bash
好了,如今两容器能够互ping了
本文探讨了局域网中不一样宿主机间Docker容器直接通讯的一种可能方案。固然如今实现跨主机容器间通讯的现成方案也不少,典型的好比flannel这种,个人 我的私有云 也用的是这种方案。
做者更多的SpringBt实践文章在此:
若是有兴趣,也能够抽点时间看看做者一些关于容器化、微服务化方面的文章: