解决多台Docker主机容器间通信

背景

在学习部署elasticsearch集群的过程中,采用了docker部署方式。在单个docker主机内容器间可以互相通信,然而elasticsearch所需资源较多,一般都是一个主机一个节点。于是我克隆了两个虚拟机,用于模拟生产环境多主机docker部署。

事故现场

在这里插入图片描述

completed handshake with [{es01}{UnmdQLEwT-SK16zE4VTUpw}{ywZQUGfpSw6Rg73ox4dmsQ}{es01}{172.19.0.2}{172.19.0.2:9301}{cdfhilmrstw}] at [192.168.0.226:9301] but followup connection to [172.19.0.2:9301] failed

解决方案一

在主机中把另外主机上docker容器的网段加入到路由表中。

现有主机A 192.168.0.226,主机B 192.168.0.227
修改A主机docker容器使用的network网段为10.19.0.0/24,B主机仍保持默认的网段172.19.0.0/24不变

临时方案

A主机中添加路由表

sudo route add -net 172.19.0.0 netmask 255.255.0.0 gw 192.168.0.227

B主机中添加路由表

sudo route add -net 10.19.0.0 netmask 255.255.0.0 gw 192.168.0.226

这种方式添加的路由,网卡重启后会丢失

永久方案

在/etc/init.d/network中,存在如下脚本

# Add non interface-specific static-routes.
if [ -f /etc/sysconfig/static-routes ]; then
   if [ -x /sbin/route ]; then
      grep "^any" /etc/sysconfig/static-routes | while read ignore args ; do
      /sbin/route add -$args
         done
        else
            net_log $"Legacy static-route support not available: /sbin/route not found"
        fi
   fi

其意思是如果存在/etc/sysconfig/static-routes,就过滤出any开头的执行route add,相当于临时方案中的手动添加路由
特别注意:脚本会在route add 后面自带-,any后面的net或者host前面无需添加-
A主机

sudo vim /etc/sysconfig/static-routes 

添加以下内容

any net 172.19.0.0 netmask 255.255.0.0 gw 192.168.0.227

B主机

sudo vim /etc/sysconfig/static-routes 

添加以下内容

any net 10.19.0.0 netmask 255.255.0.0 gw 192.168.0.226

然后重启主机

sudo reboot

或者重启网卡

sudo systemctl restart network

到此结束,主机A,B中的容器可以相互访问。
在这里插入图片描述

解决方案二

使用Docker的overlay网络,解决跨主机通信,如果仅以容器启动,创建overlay网络需添加–attachable。关于overlay网络使用详解

猜你喜欢

转载自blog.csdn.net/baidu_38956956/article/details/128253282