## 1. 问题所示
启动已停止的容器,并报告以下错误
```cmd
Error response from daemon: driver failed programming external connectivity on endpoint DevDcLaw (c5e4452ceded5a794da894067f539d70ecf0d870af038e529e76f63902a): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8762 -j DNAT --to-destination 172.17.0.4:8761 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1))
```
## 2. 分析原理
主要原因是在启动docker容器或进行docker配置时,还设置了防火墙,防火墙停止或重新启动将清除docker的相关配置,导致在查询防火墙规则时无法显示docker链,iptables -L 查看iptables 链
```cmd
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
```
- docker容器的底层原理:
启动docker时,会自动在iptables中注册一个链,其注册信息也可以通过防火墙链找到。这些链主要是注册的,用于docker中的容器暴露端口。
- 具体原因是你删除了iptables中的链
删除链接的方法有很多:关闭或重启firewalld防火墙即可清除。firewalld超过centos7,iptables低于centos6,firewalld底部涉及iptables,启动firewalld时自动删除iptables链的相关链接。
- 如果删除链接的其他方式没有特殊情况,则需要发现
- 因此,在涉及防火墙firewalld的命令或iptables中的命令时,小心删除与docker相关的链
## 3. 问题解决
由于firewalld重启,docker重启将重新注册iptables链,因此只需重启docker容器即可解决此问题
```
systemctl restart docker
```
此时查询iptables 链,数据正常
## 4.总结
宿主机上docker服务启动后,`尽量不要操作防火墙`,包括重启或关闭操作,必须在操作时重启docker服务