news 2026/2/13 11:20:39

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【踩坑记】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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/11 14:59:59

C语言从句柄到对象

C语言从句柄到对象 (一) —— 全局变量的噩梦与“多实例”的救赎 代码里的句柄(Handle) 到底是个什么东西?为什么大厂的代码库(SDK)里到处都是句柄?” 其实,“句柄” (Handle) 不仅仅是一个指针,它是 C 语言通向模块化和面向对象架构的第一把钥匙。 今天,我们不谈枯燥…

作者头像 李华
网站建设 2026/2/9 1:36:06

STM32CubeMX新手教程:时钟树配置通俗解释

STM32时钟配置不再难:一文讲透CubeMX下的时钟树原理与实战技巧你有没有遇到过这样的情况?串口通信乱码,查了半天发现波特率偏差太大;USB设备插电脑上无法识别,最后发现是48MHz时钟没对齐;定时器定时不准&am…

作者头像 李华
网站建设 2026/2/13 3:40:19

零基础学习JLink下载的完整操作流程

从零开始掌握J-Link固件烧录:深入理解调试原理与实战技巧 你是否曾遇到这样的场景? 编译好的程序无法下载到STM32板子上,Keil提示“Cortex-M Debug Error”;或者在产线批量烧录时,每台设备都要手动点击“Program”&a…

作者头像 李华