启动docker时出现No chain/target/match by that name,如下图·:
看到这个报错: iptables: No chain/target/match by that name,可以知道是跟iptables有关。
通常意味着Docker在尝试设置iptables规则时遇到了问题,这可能由于Docker网络配置不正确,或者系统上Docker所需的规则发生了冲突。
原因:
如果在启动docker service的时候网关是关闭的,那么docker管理网络的时候就不会操作网管的配置(chain docker),然后网关重新启动了,导致docker network无法对新container进行网络配置,也就是没有网管的操作权限,做重启处理。换一种更加易懂的方法回答解析。
我们用一个简单的例子分析一下:
想象一下,Docker就像一个工厂,工厂里有一群工人(容器),工厂外有一条公路(网络)。当工厂开工时,工人们需要通过工厂大门(网关)把货物送到公路上。Docker在启动时,会设置一个虚拟的大门,让容器能够通过这个大门与外界通信。
现在,如果工厂开工的时候大门是关闭的,那么Docker就无法设置这个虚拟大门。但是,如果后来大门又打开了,Docker并没有重新设置虚拟大门的权限,这就导致了一个问题:工人们(容器)现在无法通过大门将货物送到公路上。
使用的centos7服务器,在部署docker的过程中,因端口问题有启停firewalld服务,在centos7里使用firewalld代替了iptables。在启动firewalld之后,iptables还会被使用,属于引用的关系。所以在docker run的时候,iptables list里没有docker chain,重启docker engine服务后会被加入到iptables list里面。
于是为了解决这个问题,我们有如下解决办法:
解决办法:
1.重启工厂(Docker服务):重启工厂,让Docker在大门开启的情况下重新设置虚拟大门
systemctl restart docker
#或者
service docker restart
2.检查大门(网关)的状态:确保大门是开启的,并且Docker有权限操作它
ip link show docker0
#如果docker0是DOWN的,你需要将它设置为UP:
ip link set docker0 up
3.检查交通规则(iptables规则):检查iptables规则,确保没有规则阻止了Docker的网络配置
sudo iptables -t nat -L
4.暂时关闭交通管制(防火墙)/关闭网关:如果你的系统上有其他交通管制(比如firewalld防火墙),它们可能会干扰Docker的网络设置。你需要暂时关闭它们
systemctl stop firewalld
systemctl stop iptables