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网络宿主机无法连接到容器的解决方案的主要内容,如果未能解决你的问题,请参考以下文章