Docker【2】iptables 错误解决

iptables 错误解决

  • 问题说明
  • 问题分析
  • 解决步骤
    • [1. 确保 `iptables` 模块已加载](#1. 确保 iptables 模块已加载)
    • [2. 检查和重启 `docker` 服务](#2. 检查和重启 docker 服务)
    • [3. 检查 `firewalld` 状态](#3. 检查 firewalld 状态)
    • [4. 重置 `iptables` 规则](#4. 重置 iptables 规则)
    • [5. 查看和更新 Docker 配置](#5. 查看和更新 Docker 配置)
  • 总结

问题说明

执行的 docker 命令如下,启动 nginx 并设置宿主机端口 (8080) 与容器端口 (80) 的映射,出现了一个错误提示:iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8080 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name.

bash 复制代码
[root@localhost ~]# docker run -d -p 8080:80 --name ng nginx

d3e86c9e5651c07167bf6a4f6eacaefa3f0d1734d03f993dd059575394712fab
docker: Error response from daemon: driver failed programming external connectivity on endpoint ng (67f87043e441fddd238cb9844f0eeeacdbf298b8c64b6c92e2319cde16ba6a1b):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8080 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name.
 (exit status 1)).
[root@localhost ~]# 

问题分析

这个错误提示表明 Docker 在尝试设置端口转发时,遇到了 iptables 配置问题。具体错误信息显示,iptables 试图创建一条规则,但未能找到所需的链或目标。

这个问题可能与以下几种情况有关:

  1. iptables 模块缺失或未加载 :某些系统默认情况下可能没有加载 iptables 模块。
  2. iptables 规则损坏 :如果 iptables 规则集损坏或配置不正确,也可能会导致这个错误。
  3. 防火墙冲突 :如果系统上运行了另一个防火墙管理工具(如 firewalld),可能会与 Docker 的 iptables 配置冲突。

解决步骤

前置说明

本次遇到问题,是因为 ip_tables 模块未加载引起;手动加载了一下、并重启 docker,问题得以解决。

1. 确保 iptables 模块已加载

检查 iptables 模块是否已加载:

bash 复制代码
lsmod | grep ip_tables

如果没有输出,说明 iptables 模块未加载,可以手动加载:

bash 复制代码
modprobe ip_tables

2. 检查和重启 docker 服务

有时候,重启 docker 服务可以解决问题:

bash 复制代码
systemctl restart docker

3. 检查 firewalld 状态

如果系统上运行了 firewalld,尝试临时停止它以确定是否是它引起的问题:

bash 复制代码
# 停止防火墙
systemctl stop firewalld
# 禁用防火墙
systemctl disable firewalld.service 

然后再尝试运行 Docker 容器。如果确认是 firewalld 的问题,可以通过 firewalld 配置来允许 Docker 管理 iptables 规则。

4. 重置 iptables 规则

如果 iptables 规则集可能损坏,可以尝试重置它:

bash 复制代码
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -X

然后重启 docker 服务:

bash 复制代码
systemctl restart docker

5. 查看和更新 Docker 配置

确保 Docker 使用的是正确的 iptables 配置。在 Docker 的配置文件(通常在 /etc/docker/daemon.json)中,确保包含以下设置:

json 复制代码
{
  "iptables": true
}

如果进行了修改,重启 Docker 服务以应用更改:

bash 复制代码
systemctl restart docker

总结

上述步骤涵盖了大多数情况下可能导致 iptables 相关问题的原因及其解决方法。通过依次检查和调整这些配置,你应该能够解决 Docker 容器启动时的端口转发问题。如果问题仍然存在,请查看系统日志(如 /var/log/messagesdmesg)以获得更多调试信息。

相关推荐
程序喵大人5 小时前
【C++进阶】STL容器与迭代器 - 05 map 和 set 为什么按键保持有序
开发语言·c++·容器·迭代器·stl
风曦Kisaki6 小时前
Kubernetes(K8s)笔记Day03: Pod命名空间,标签,Pod 的调度,污点与容忍度,Pod 常见状态和重启策略,Pod 生命周期
linux·运维·笔记·docker·云原生·容器·kubernetes
张忠琳6 小时前
【NVIDIA】NVIDIA k8s-device-plugin v0.19.3 资源管理器模块深度分析之三
云原生·容器·架构·kubernetes·nvidia
毛驴赶鹿7 小时前
低配置服务器怎么搭建监控?Komari Docker部署与公网访问完整教程
运维·服务器·docker
Chengbei118 小时前
云安全漏洞挖掘SKILL、一站式云漏洞挖掘工具,支持S3爆破、IMDS探测、K8s检测与AK/SK权限利用
前端·人工智能·网络安全·云原生·容器·kubernetes·系统安全
Ai拆代码的曹操9 小时前
K8s 调度器 predicate 阶段揭秘:为什么你的 Pod 总是堆在同一台机器
后端·容器
Ai拆代码的曹操9 小时前
手摸手排查:Pod CrashLoopBackOff 日志丢失问题,3 层兜底方案
后端·容器
张忠琳10 小时前
【NVIDIA】k8s-device-plugin v0.19.3 — CDI / MIG / vGPU 模块超深度代码分析之五
云原生·容器·架构·kubernetes·nvidia
冷莫溪10 小时前
Docker——3.Harbor 核心架构与原理详解
docker·容器·架构
冷莫溪11 小时前
Docker——1.安装与相关命令
运维·服务器·docker·容器