docker: Error response from daemon: driver failed programming external connectivity on endpoint tomcat1 (9d06342addfe339a1bbf0876ae4534410f58cc65fa0b3b6516f282224af68202): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8080 -j DNAT --to-destination 172.17.0.2:8080 ! -i docker0: iptables: No chain/target/match by that name. (exit status 1)).

1.错误重现

  • 服务器环境:CentOS7.9
  • 进行实验:Docker启动Tomcat容器,端口出现问题

1.1 错误场景

当我在使用 docker 运行 tomcat 容器的时候,爆出了如下的错误

docker: Error response from daemon: driver failed programming external connectivity 
on endpoint tomcat1 (9d06342addfe339a1bbf0876ae4534410f58cc65fa0b3b6516f282224af68202)
:  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8080 -j 
DNAT --to-destination 172.17.0.2:8080 ! -i docker0: iptables: No chain/target/match 
by that name.
 (exit status 1)).

在这里插入图片描述

仔细一看,应该是有关 iptables 的规则问题,然后 8080端口出现了 destination 即定义出口的问题,然后不满足 iptables规则问题,而 iptables 是 firewalld防火墙的内部实现方式,属于更底层的防火墙规则

1.2 检查排错过程

  • 首先检查一下是否存在端口占用
[root@d ~]# netstat -tunlp | grep 8080

发现并没有端口占用 8080,说明不是端口占用的问题,然后需要排查 防火墙问题

[root@d ~]# firewall-cmd --list-all --zone=trusted
trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces: ens33
  sources:
  services:
  ports: 8080/tcp 80/tcp 6379/tcp 4369/tcp 25672/tcp 15672/tcp 5672/tcp 8100/tcp 5673/tcp 2184/tcp 2185/tcp 2186/tcp 9092/tcp 9093/tcp 9094/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

在这里插入图片描述

防火墙也确实是放行了 8080 端口,防火墙也应该没有问题,但是报错显示 iptables 的防火墙规则,因为 firewalld 是 iptables 的上层应用,所以我们重启一下 firewalld,进行测试

[root@d ~]# systemctl start firewalld.service

还需要重启一下 docker,因为这是与 docker 相关的 iptables 规则,我们要重新启动,生成新的规则

[root@d ~]# systemctl restart docker

然后再次创建 tomcat 容器

[root@d ~]# docker run -id --name tomcat1 -p 8080:8080 tomcat:7-jre7 /bin/bash
a874d7e2fb26c3e8f8b8ab09eb9f2823d7d4a0151eea12665675312bdf0fe411

[root@d ~]# docker ps | grep tomcat1
a874d7e2fb26   tomcat:7-jre7                      "/bin/bash"              24 minutes ago   Up 24 minutes                     0.0.0.0:8080->8080/tcp, :::8080->8080/tcp                       tomcat1

此时说明 tomcat 容器创建成功,没有爆出对应的错误
在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐