关闭防火墙导致docker容器启动异常

发布时间:2023-04-23 09:42:47

## 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服务

上一篇 (五)SpringBoot中的SpringSecurity
下一篇 Java Web 文章管理系统

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题