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

Posted shi_zi_183

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 

以上是关于Docker overlay网络宿主机无法连接到容器的解决方案的主要内容,如果未能解决你的问题,请参考以下文章

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

Docker Overlay 应用部署

docker桥接模式

Docker-04-docker单机网络详解

docker从零开始网络(一) overly网络

docker里面overlay作用是啥?