我正在尝试在 Windows 10 计算机上的 WSL-2 中运行的 Ubuntu 22.04.3 LTS 中运行 docker。
我已按照说明进行操作这里。但它仍然不起作用,当我运行时出现以下错误sudo dockerd
:
failed to register "bridge" driver: failed to create NAT chain DOCKER:
iptables failed: iptables -t nat -N DOCKER:
iptables v1.8.7 (legacy): can't initialize iptables table `nat':
Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
(exit status 3)
当我这样做时,modprobe ip_tables
我得到:
modprobe: FATAL: Module ip_tables not found in directory /lib/modules/4.4.0-22621-Microsoft
答案1
这是由于 Docker 中的一个错误造成的。 iptables 有两个版本:旧版本(在iptables-legacy
包中)和较新 nftables 的包装器(在iptables-nft
包中)。 nftables 是一个更好、更强大的系统,因此它是较新发行版的默认系统。
然而,Docker无法与 nftables 一起正常工作。然而,正如这篇博文中所概述的,可以改为包iptables-legacy
。您可以安装该软件包,然后运行sudo update-alternatives --config iptables
,选择旧选项而不是 nft 选项,然后重新启动 docker 守护程序。
另请注意,默认情况下,WSL 2 附带所有内置内核模块,并且没有可动态加载的模块,因此modprobe
无法执行任何操作。出现这种情况的部分原因是各个发行版创建并发布发行版映像,而不是 Microsoft,但内核是 Microsoft 独有的。发布可加载内核模块是不切实际的,因为它需要发行版使用 Microsoft 的内核映像更新其映像(这会造成后勤和政策问题),因此 Microsoft 不会这样做。
答案2
我跟着这个帖子,它说以ubuntu.exe
管理员身份启动,这将解决问题。
其作用是重新安装发行版并iptables
在那里工作。在我之前安装的第一个发行版上仍然无法工作。但它在这个新安装的发行版上运行良好,所以我认为它已修复。