docker异常

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 

重新启动容器即可

阅读更多
换一批

没有更多推荐了,返回首页