docker容器提示:-i docker0: iptables: No chain/target/match

f8f90520e0ecc922a3b4a234e1376e10.png

你这条报错在 CentOS 7 上非常常见,原因多半是——

firewalld 或 systemd 重载后清空了 iptables nat 表中的 DOCKER 链,导致 Docker 端口映射失败。


1.问题回顾

docker拉起容器提示iptable链无法创建(核查对应iptable内核模块是否加载?)

env

  • centos7

日志中提到:

iptables: No chain/target/match by that name.
(driver failed programming external connectivity on endpoint ...)

意思是 Docker 想往 nat 表中写规则时,找不到 DOCKER 链(因为被删了)。


2.CentOS 7 排查与修复步骤

2.1检查 Docker 自带链是否存在

1
sudo iptables -t nat -L -n

如果输出中没有类似:

Chain DOCKER (2 references)
target     prot opt source               destination

那就确认链确实丢失。


2.2检查 firewalld 状态

CentOS 7 默认使用 firewalld 管理 iptables,很多人重载后清空了 Docker 链。

1
sudo systemctl status firewalld
  • 如果 firewalld 是 active 状态,可以:

    1
    2
    sudo systemctl stop firewalld
    sudo systemctl disable firewalld

    然后让 Docker 自己接管 iptables。

  • 或者保留 firewalld,但让它别清空 Docker 链:
    编辑配置:

    1
    sudo vi /etc/firewalld/firewalld.conf

    改成:

    CleanupOnExit=no
    

    然后重启:

    1
    sudo systemctl restart firewalld

2.3检查内核模块

1
sudo lsmod | grep -E 'br_netfilter|ip_tables|xt_nat'

如未加载则补齐:

1
2
3
sudo modprobe br_netfilter
sudo modprobe ip_tables
sudo modprobe xt_nat

2.4重新加载 Docker 网络环境

重启 Docker:

1
sudo systemctl restart docker

然后再次验证:

1
sudo iptables -t nat -L -n | grep DOCKER

2.5启动容器验证

1
2
docker start nexus
docker ps

应看到:

0.0.0.0:6106->8081/tcp

3.Docker 端口映射原理

781b2262514c8c4e3572307f8dc249a2.png

只要 DOCKER 链缺失,上述 DNAT 流转就中断。