不重启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