Docker overlay网络宿主机无法连接到容器的解决方案

Docker overlay网络宿主机无法连接到容器的解决方案

问题阐述

docker 使用原生跨主机overlay网络部署集群时,发现宿主机无法连接到容器中

测试案例

启动一个resourcemanager来测试

docker run --name test1 --hostname resourcemanager --rm -p 8088:8088 --net hadoop_net -it resourcemanager:1.0

查看resourcemanager分配的ip

docker exec -it test1 ip addr

在这里插入图片描述
可以看到容器的ip为10.0.0.2这是hadoop_net这个网络的ip
查看当前宿主机网络
在这里插入图片描述
找不到对应网段为10.1.0.0/24网段的hadoop_net,这是因为overlay网络中宿主机并没有进入hadoop_net网络,hadoop_net接入外部是通过网桥(docker_gwbridge)实现的,理论上来说宿主机需要通过docker_gwbridge才能找到hadoop_net这个网络。
我们可以来看使8088端口暴露的nat转发的规则。

iptables -t nat -nvL

    0     0 DNAT       tcp  --  !docker_gwbridge *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8088 to:172.18.0.2:8088

在这里插入图片描述
可以看到docker写入的nat规则将宿主机上8088端口的请求改写了ip转发给了172.18.0.2的8088端口,这个172.18.0.2就是容器在docker_gwbridge的”虚拟ip“,我们是可以ping通他的,说明它与容器相连。
在这里插入图片描述
但是其中所有的接口都是无法访问的!!!
在这里插入图片描述
这导致我们不得不想办法解决它。
跨宿主机的容器之间网络是完全正常的,可以相互连接,并通过hostname找到彼此,但是宿主机不能暴露容器端口的问题是致命的,因为不能交给外部使用的集群是不具开发价值的。

解决方案

这里使用改写路由+nat规则实现端口暴露。

改写路由

访问不了172.18.0.2,我们可以尝试直接访问10.0.0.2,但是我们宿主机没有接入hadoop_net,无法连接
在这里插入图片描述
我们可以将10.0.0.2请求传递给docker_gwbridge,来实现转发,这需要改写路由表
查看当前路由

route -n

在这里插入图片描述
写入新路由
将10.0.0.0/24的请求发送到192.168.2.254.

route add -net 10.0.0.0 netmask 255.255.255.0 gw 172.18.0.1 dev docker_gwbridge

在这里插入图片描述
在这里插入图片描述
可以看到我们已经可以ping通了
在这里插入图片描述
可以看到10.0.0.2的端口也可以访问了。

编写nat规则

虽然宿主机可以访问到了容器但是,外部的用户机没有接入docker_gwbridge仍然无法访问容器,我们只需要将宿主机某个端口的请求,修改ip来转发给docker_gwbridge,即可访问。
查看已有nat规则

iptables -t nat -nvL

在这里插入图片描述
因为我们使用 -p启动8088端口被占用了,我们重启容器不使用-p暴露端口。

docker run --name test1 --hostname resourcemanager --rm  --net hadoop_net -it resourcemanager:1.0

编写nat

iptables -t nat -A DOCKER -p tcp -m tcp --dport 8088 -j DNAT --to-destination 10.0.0.2:8088

在这里插入图片描述
访问
在这里插入图片描述
成功
删除nat
查看规则编号

iptables -t nat -nL --line-number

在这里插入图片描述
删除编号

iptables -t nat -D DOCKER 4 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值