FAQ docker运行容器时遇到的一个iptables的报错

faq,docker,运行,容器,遇到,一个,iptables,报错 · 浏览次数 : 44

小编点评

**docker启动容器报错信息:** ``` Error response from daemon: driver failed programming external connectivity on endpoint gracious_sutherland (0f46051611e83ef3e69c84bc17b2ef4f60ca03fe729020ba8348c2f845f0d26f): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8083 -j DNAT --to-destination 172.17.0.5:80 ! -i docker0: iptables: No chain/target/match by that name. (exit status 1)). ``` **问题原因:** 容器无法访问外网络,因为 `iptables` 阻止了来自宿主机对 `docker0` 网络的访问。 **解决方案:** 1. **重启 Docker 服务:** ``` systemctl restart docker ``` 2. **允许 Docker访问外网络:** 设置 `iptables` 规则允许来自宿主机访问 `docker0` 网络: ``` iptables -t nat -A DOCKER -p tcp -d 0/0 --dport 8083 -j DNAT --to-destination 172.17.0.5:80 ``` 3. **重新启动容器:** ``` docker run -itd -p 8083:80 nginx803cfa1c24b7c1a0934551fa19915c9abee1b22a2ed8a7a86268a9b244c88e7e ``` **注意:** * `docker0` 是 Docker 使用的虚拟网络名称。 * `iptables` 规则需要在启动 Docker 服务之前加载。 * 确保 `docker0` 网络已配置并正常。

正文

现象

  • 某个同学执行docker启动容器的时候提示
docker: Error response from daemon: driver failed programming external connectivity on endpoint frosty_montalcini (5f23d1b819d9b55a229a9fb789c7f0897123b7e218694eefbc31487e8e4883a6):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8082 -j DNAT --to-destination 172.17.0.5:80 ! -i docker0: iptables: No chain/target/match by that name.
 (exit status 1)).
  • 这个报错Error response from daemon提示是daemon给了一个错误的响应

  • daemon是这个

    [root@qianhanyi ~]# ps -ef|grep dockerd
    root      16921      1  2 04:12 ?        00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
    
    
  • 为何能给response,因为dockerd是个RESTful的API server

    [root@qianhanyi ~]# docker version
    Client: Docker Engine - Community
     Version:           23.0.1
     API version:       1.42  # 这里
    
    # 有空考虑写一个api操作docker的文章
    
  • 报错提到了iptables,这是关键线索

现场还原

以centos7为例

  • 确保你的firewalld正常

    [root@qianhanyi ~]# systemctl status firewalld
    ● firewalld.service - firewalld - dynamic firewall daemon
       Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
       Active: active (running) since Fri 2022-11-18 04:12:19 CST; 7min ago
         Docs: man:firewalld(1)
     Main PID: 16655 (firewalld)
        Tasks: 2
       Memory: 23.6M
       CGroup: /system.slice/firewalld.service
               └─16655 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
    
    ...
    Hint: Some lines were ellipsized, use -l to show in full.
    
    
  • 运行一个容器,比如nginx的

    [root@qianhanyi ~]# docker run -itd -p 8082:80 nginx
    253fe5d60b8446612ae76bee9476eeb96b3c294b46a7c87c3c21ffe26dcaa1ec
    [root@qianhanyi ~]# docker ps -a
    CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS         PORTS                                       NAMES
    253fe5d60b84   nginx      "/docker-entrypoint.…"   4 seconds ago    Up 3 seconds   0.0.0.0:8082->80/tcp, :::8082->80/tcp       infallible_pasteur
    
    
  • 浏览器访问ip:8082,可能会无法访问

  • 此时你想到了防火墙的原因

  • 停了吧

    [root@qianhanyi ~]# systemctl stop firewalld
    [root@qianhanyi ~]# systemctl status firewalld
    ● firewalld.service - firewalld - dynamic firewall daemon
       Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
       Active: inactive (dead) since Fri 2022-11-18 04:26:36 CST; 8s ago
         Docs: man:firewalld(1)
      Process: 16655 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
     Main PID: 16655 (code=exited, status=0/SUCCESS)
    
    ...
    Nov 18 04:26:35 qianhanyi systemd[1]: Stopping firewalld - dynamic firewall daemon...
    Nov 18 04:26:36 qianhanyi systemd[1]: Stopped firewalld - dynamic firewall daemon.
    Hint: Some lines were ellipsized, use -l to show in full.
    
    
  • 此时应该能访问了

  • 过了一会,你又启动了一个容器

    [root@qianhanyi ~]#  docker run -itd -p 8083:80 nginx
    4a7658f1669a76fd990e5757afe8c32d09fee6bf6b6fa55426e2abf0d88f29e0
    docker: Error response from daemon: driver failed programming external connectivity on endpoint gracious_sutherland (0f46051611e83ef3e69c84bc17b2ef4f60ca03fe729020ba8348c2f845f0d26f):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8083 -j DNAT --to-destination 172.17.0.5:80 ! -i docker0: iptables: No chain/target/match by that name.
     (exit status 1)).
    
    
  • 至此复现了问题

解决

  • 此时你只需重启下docker应用程序

    [root@qianhanyi ~]# systemctl restart docker
    
    # 当然你要关注下,你之前启动的其他容器有没有配置--restart=always, 如果没有那些容器记得需要的话启动下
    
  • 再次启动容器

    [root@qianhanyi ~]#  docker run -itd -p 8083:80 nginx
    803cfa1c24b7c1a0934551fa19915c9abee1b22a2ed8a7a86268a9b244c88e7e
    
    

思考

  • docker 是有网络的,容器网络实质上是由 Dokcer 为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP 协议栈、端口套接字、IP 路由表、防火墙等等与网络相关的模块。
  • 本质的原因本文还是没找到
  • docker网络这部分也可以单独拉出来讲一个篇幅

与FAQ docker运行容器时遇到的一个iptables的报错相似的内容:

FAQ docker运行容器时遇到的一个iptables的报错

现象 某个同学执行docker启动容器的时候提示 docker: Error response from daemon: driver failed programming external connectivity on endpoint frosty_montalcini (5f23d1b819

FAQ docker运行tomcat提示找不到文件

docker运行tomcat提示找不到文件 问题描述 docker课程中,老师是用tomcat镜像来演示docker的一些操作 但同样的操作有的同学是ok的,有的同学就会遇到如下错误 核心信息 Exited(1) Cannot find /usr/local/tomcat/bin/setclassp

【FAQ】关于华为地图服务定位存在偏差的原因及解决办法

一、 问题描述: 华为地图服务“我的位置”能力,在中国大陆地区,向用户展示他们在地图上的当前位置与用户的实际位置存在较大的偏差。 具体差别可以查看下方的图片: 二、 偏差较大的原因: 华为Map SDK在中国大陆使用的地理坐标系是GCJ02。 点击“我的位置”控件,获取的定位经纬度的地理坐标系是WG

【FAQ】在华为鸿蒙车机上集成华为帐号的常见问题总结

随着新一代信息技术与汽车产业的深度融合,智能网联汽车正逐渐成为汽车产业发展的战略制高点,无论是传统车企还是新势力都瞄准了“智能座舱”这种新一代人机交互方式。面对竞争如此激烈的车机市场,华为鸿蒙车机系统的出现,给消费者带来了不同凡响的便捷使用感受,这得益于华为在硬件、软件和场景优化上的技术优势,用户只

【FAQ】申请Health Kit权限的常见问题及解答

华为运动健康服务(HUAWEI Health Kit)提供原子化数据开放,用户数据被授权获取后,应用可通过接口访问运动健康数据,对相关数据进行增、删、改、查等操作。这篇文章汇总了申请开通Health Kit测试权限的常见问题,并给出了详细解答,希望为开发者提供相关参考。 (1) 申请Health K

【FAQ】推送服务常见问题及解决方案

一、推送成功收不到消息,推送返回:{"message":"success","requestID":"1523868*****2842718","resultcode":0} 排查步骤: 1、网络不稳定,切换稳定网络进行测试; 2、检查手机是否为EMUI8.0.0系统,如果是早期的EMUI8.0,则

【FAQ】申请运动健康服务验证环节常见问题及解答

华为 HMS Core 运动健康服务(HUAWEI Health Kit)提供原子化数据开放。应用在获取用户数据授权后,可通过接口访问运动健康数据,对用户数据进行读写等操作,为用户提供运动健康类数据服务。 开发者应用在开发和测试阶段访问用户运动或健康数据时,会有100个用户的数量限制,需要通过“申请

【FAQ】集成分析服务的常见问题及解决方案

常见问题一:如何验证Analytics是否上报/接入成功?以及关键日志含义是什么? 在初始化Analytics SDK前添加SDK日志开关如下: HiAnalyticsTools.enableLog (); 2.初始化SDK代码如下: HiAnalyticsInstance instance = H

【FAQ】获取Push Token失败,如何进行排查?

一、 获取Push Token的方式 获取Push Token有两种方式:一种是调用getToken方法向Push服务端请求Token,当getToken方法返回为空时,Token可通过onNewToken方法返回,因此需要实现onNewToken方法;另一种是自动初始化,Token通过onNewT

【FAQ】关于华为推送服务因营销消息频次管控导致服务通讯类消息下发失败的解决方案

一. 问题描述 使用华为推送服务下发IM消息时,下发消息请求成功且code码为80000000,但是手机总是收不到消息; 在华为推送自助分析(Beta)平台查看发现,消息发送触发了频控。 二. 问题原因及背景 2023年1月05日起,华为推送服务对咨询营销类消息做了单个设备每日推送数量上限管理,具体