1、我们时常会遇到这样的问题,我们的微服务容器正常跑着 ,忽然就连不上了。可是我们去docker查看容器状态,可以看到全部容器的状态都是开启的。
这个时候,我们尝试重启容器。可是会报以下错误:
docker: Error response from daemon: failed to create endpoint Haproxy on network bridge: iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 6302 -j DNAT --to-destination 192.168.0.8:6301 ! -i docker0: iptables: No chain/target/match by that name。
我们能看到这个错误是和iptables有关的。
经过搜索,原因是因为
使用bridge进行创建容器的时候,如果默认docker里没有设置,会让docker额外对宿主机的iptables的nat链进行操作,如果你创建好docker容器后,在重启宿主机的iptables,那么你无法通过设置的端口连接容器。
大概的过程如下
正常是黑色的。这也就说明了为什么docker启动后我们外部可以访问iptables未开放的端口。
若是iptables变动则是红色的。注意;它会断开网桥。
然后我们的访问就无法通过iptables了。异常1:无法访问容器
同时因为网桥的断开,导致我们启动容器时无法通过网桥启动容器,就会报以上的错误。异常2:无法重启容器
主要建议:
关闭docker修改宿主机iptables功能。
手动修改宿主机iptables的nat来控制防火墙功能。
如只对外暴露eureka,和zuul 的端口
这样会产生一个问题是 无法再通过端口单独调用微服务
其他方式:
解决方式【1】
最麻烦的方式,重启docker。
然后再次部署每一个容器。
解决方式【2】尚未验证
查看iptables配置文件
cat /etc/sysconfig/iptables (主要是filter和nat的配置)
这里看到filter和nat并没有docker的配置信息,所以添加上对应的信息如下;
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [17:2536]
:syn-flood - [0:0]
:DOCKER - [0:0]
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:DOCKER - [0:0]
重启iptables
sudo systemctl restart iptables.service
重新启动容器即可