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)以获得更多调试信息。

相关推荐
Aspartame~37 分钟前
K8s的相关知识总结
java·容器·kubernetes
plusplus1684 小时前
Kubernetes“城市规划”指南:告别资源拥堵与预算超支,打造高效云原生都市
云原生·容器·kubernetes
m0_515790415 小时前
【深度学习实战(55)】记录一次在新服务器上使用docker的流程
docker
qq_312920115 小时前
K8s存储类(StorageClass)设计与Ceph集成实战
ceph·容器·kubernetes
Nazi65 小时前
kubeadm部署k8s集群环境搭建
云原生·容器·kubernetes
Brilliantee4045 小时前
藏在 K8s 幕后的记忆中枢(etcd)
容器·kubernetes·etcd
草明5 小时前
docker stats 增加一列容器名称的显示
java·开发语言·docker
焯集新人7 小时前
K8S高可用集群
云原生·容器·kubernetes
楚禾Noah7 小时前
【通用常识】YAML 中的高阶语法
运维·docker·容器
东心十15 小时前
Win11安装WSL、Docker Desktop
运维·docker·容器