当前位置: 首页 > news >正文

【踩坑记】WSL1 下 Docker 报错 iptables: No chain/target/match by that name 排查实录

这是一篇为你整理的“踩坑记”,还原了从报错、排查到发现核心原因并解决的全过程。


【踩坑记】WSL1 下 Docker 报错iptables: No chain/target/match by that name排查实录

1. 背景与环境

今天在 WSL (Ubuntu 24.04) 环境下部署 Dify 项目,执行启动命令时遭遇 Docker 网络初始化失败。整个过程一波三折,最终发现是因为 WSL 版本过低导致的兼容性问题。

2. 报错现场

在项目目录下执行docker compose up,容器启动报错:

yan@DESKTOP-73KF9NM:~/dify/dify-1.11.2/docker$ docker compose up WARN[0000] No services to build [+] up 1/1 ✘ Network docker_default Error Error response from daemon: Failed to Setup IP tables: Unable to enable NAT rule: (iptables failed: iptables ... 4.8s failed to create network docker_default: Error response from daemon: Failed to Setup IP tables: Unable to enable NAT rule: (iptables failed: iptables --wait -t nat -I P OSTROUTING -s 172.18.0.0/16 ! -o br-71e21476f69d -j MASQUERADE: iptables: No chain/target/match by that name.

核心错误信息iptables: No chain/target/match by that name.
这通常意味着 Docker 尝试配置 Linux 内核的网络防火墙规则(NAT)时,找不到对应的内核模块或支持。

3. 排查过程

第一步:检查 Docker 版本与状态

首先怀疑是 Docker 安装不完整或版本问题,查看版本和信息:

$ docker version Client: Docker Engine - Community Version: 29.1.4 ... Server: Docker Engine - Community Engine: Version: 29.1.4 ...

Docker 版本非常新(29.1.4),服务端也是正常运行的。再看docker info,发现Firewall Backend设置为iptables

第二步:检查内核版本

注意到docker info输出中的这一行:

Kernel Version: 4.4.0-19041-Microsoft

这个内核版本看起来很旧(4.4.x),且带有Microsoft标识。此时终端随后崩溃退出:

适用于 Linux 的 Windows 子系统实例已终止。

这一现象结合内核版本,让人开始怀疑 WSL 的运行模式问题。

4. 真相大白

回到 Windows PowerShell 查看 WSL 的发行版状态:

PS C:\Users\Administrator> wsl -l -v NAME STATE VERSION * Ubuntu-24.04 Running 1

找到根因了!

当前的 Ubuntu-24.04 正在WSL 1模式下运行(VERSION 为 1)。
WSL 1 只是一个翻译层,使用的是 Windows 内核,并非真正的 Linux 内核。Docker 强依赖于 Linux 内核的 Netfilter/IPtables 模块来实现网络通信,而 WSL 1 对这些特性的支持非常有限或不完整,因此导致 Docker 无法创建 NAT 规则。

5. 解决方案

必须将 WSL 发行版升级到WSL 2。WSL 2 拥有真正的 Linux 内核,能够完美支持 Docker 的网络特性。

步骤 1:启用虚拟机平台

在 PowerShell(管理员)中执行:

PS C:\Users\Administrator> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

步骤 2:转换发行版版本

尝试将 Ubuntu-24.04 转换为版本 2。

第一次尝试时报错提示内核组件需要更新:

PS C:\Users\Administrator> wsl --set-version Ubuntu-24.04 2 正在进行转换,这可能需要几分钟时间... WSL 2 需要更新其内核组件。有关信息,请访问 https://aka.ms/wsl2kernel

根据提示安装好 WSL 2 内核更新包后,再次执行转换命令:

PS C:\Users\Administrator> wsl --set-version Ubuntu-24.04 2 正在进行转换,这可能需要几分钟时间... 有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2

步骤 3:验证结果

确认版本已变为 2:

PS C:\Users\Administrator> wsl -l -v NAME STATE VERSION * Ubuntu-24.04 Stopped 2

6. 总结与反思

再次进入 WSL 环境,执行docker compose up,问题顺利解决。

经验教训
在 Windows 上使用 Docker 时,必须使用 WSL 2

  • WSL 1:由于缺少真实的 Linux 内核,无法支持 Docker 的网络特性(iptables/NAT),会导致No chain/target/match等诡异报错。
  • WSL 2:基于 Hyper-V 虚拟化技术,内置真实 Linux 内核,是 Docker Desktop 或 Docker Engine in WSL 的唯一正确选择。

以后遇到Kernel Version: 4.4.0-19041-Microsoft或 iptables 相关报错,第一时间检查wsl -l -v

http://www.jsqmd.com/news/226938/

相关文章:

  • MPC5634 Bootloader
  • autosar软件开发中诊断协议栈配置实践案例
  • RabbitMQ 集群部署方案
  • 无线网络仿真:5G网络仿真_(3).5G关键技术和性能指标
  • 洗衣店订单管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • WSL Ubuntu 安装 Docker 操作指南
  • Python高级之操作Mysql
  • cruise仿真模型,四轮驱动。 轮毂电机,轮边电机驱动cruise动力性经济性仿真模型,ba...
  • 35 岁职场危机?网络安全这行为啥越老越吃香?
  • SpringBoot+Vue 课程答疑系统管理平台源码【适合毕设/课设/学习】Java+MySQL
  • 从零实现framebuffer显示:裸机环境下简单图形输出教程
  • 前后端分离BB平台系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 安全副业指南:漏洞挖掘 / 技术博客 / 竞赛奖金实战,哪个方向更适合你?
  • STM32新手必看:Keil5代码自动补全设置手把手教程
  • Java Web 购物推荐网站系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • uds31服务ECU侧内存访问权限控制解析
  • STM32F4上实现USB2.0全速传输手把手教程
  • 【毕业设计】SpringBoot+Vue+MySQL 知识管理系统平台源码+数据库+论文+部署文档
  • 免费录屏水印工具:自动生成多种类型格式
  • LVGL GUI框架移植:零基础入门必看技术解析
  • 从Boost的设计哲学到工业实践:解锁下一代AI中间件架构的密码
  • SpringBoot+Vue 高校学科竞赛平台管理平台源码【适合毕设/课设/学习】Java+MySQL
  • Keil C51多文件编译策略:8051工程管理完整示例
  • 嵌入式开发避坑指南:HardFault_Handler问题定位核心要点
  • Linux命令-ipcrm命令(删除Linux系统中的进程间通信(IPC)资源)
  • STM32F4开发必备:固件包下载完整指南
  • 为什么“Python 做研究,Java 搞生产”?
  • 探索基于UDS的Bootloader:从功能到源码实践
  • 什么是网关?
  • Java SpringBoot+Vue3+MyBatis 智能推荐卫生健康系统系统源码|前后端分离+MySQL数据库