前言

不重启Docker服务解决iptables failed 。

问题描述

今天因为MySQL修改了配置文件,需要重启MySQL容器使之生效,然后执行了docker restart mysqlN,结果重启失败!报了以下错误:

Error response from daemon: Cannot start container mysqlN:iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 3306  **
-i docker0: iptables: No chain/target/match by that name.
 (exit status 1)

导致MySQL服务宕了一会,这可是生产环境的服务啊(/哭脸)。

接着我在网络上查找相关资料,发现遇到这个问题得同学不在少数,但是解决办法都差不多:先停止Docker服务,在重新构建docker0网卡,再开启Docker服务。

但是!!Docker运行了好些生产环境,这样重启可能会造成不可逆的未知情况,不能停啊,所以继续查找解决方案。

终于在国外的一个网址找到解决方案,成功解决这个错误问题:

When starting a container with docker run, if the firewall service isn’t started, you will see the following iptables error:
docker: Error response from daemon: driver failed programming external connectivity on endpoint (979e4123444e276344d23bf41ea1f59ea31c61ff31fe77ce38d16672b1fe2e78): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 32779 -j DNAT --to-destination 172.17.0.2:5000 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1)).

描述中说,如果防火墙服务未启动,您将看到这个iptables错误,也就是笔者遇到的这个错误。

解决过程

打开防火墙

[root@template-centos7 /root]# systemctl status firewalld.service 

重启容器

[root@template-centos7 /root]# docker restart mysqlN
mysqlN         ##重启成功

关闭防火墙

[root@template-centos7 /root]# systemctl stop firewalld.service 

问题解决。

总结

多方位思考以及查找解决方案,也就从大多数解决方案中越过坑点,避免了重启服务造成的未知情况。

希望本文能帮助到你。

参考资料:https://success.docker.com/article/iptables-error-when-starting-container-with-docker-run

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐