docker报错Error response from daemon: driver failed programming external connectivity on endpoint

报错提示:

1
2
3
[root@localhost ~]# docker run -d -p 3344:80 centos:httpd /bin/sh -c /usr/local/bin/start.sh
d5b2bd5a7bc4895a973fe61efd051847047d26385f65c278aaa09e4fa31c4d76
docker: Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen (6bda693d1143657e46bee0300276aa05820da2b21a3d89441e820d1a274c48b6): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 3344 -j DNAT --to-destinatio

原因

docker服务启动时定义的自定义链DOCKER由于firewall 被清掉

firewall的底层是使用iptables进行数据过滤,建立在iptables之上,这可能会与 Docker 产生冲突。

docker容器的底层原理决定在启动docker的时候会在iptables中注册一个链,通过防火墙的链也可以找到其注册的信息,主要注册这些链,是docker中的容器为了暴露端口而使用的

这时当 firewalld 启动或者重启的时候,将会从 iptables 中移除 DOCKER 的规则,从而影响了 Docker 的正常工作

解决

重启docker容器即可解决该问题

1
systemctl restart docker