在 WSL2 上安装 docker

在 WSL2 上安装 docker

我在 Raspberry PI 上使用 iptables 时遇到了问题。
我刚刚在 PI 上下载了新版本的 Raspbian Lite,我试图检查 iptables 规则,但它不起作用,并且出现了此错误:
>> iptables -L
iptables/1.8.2 Failed to initialize nft: Protocol not supported
我不知道该怎么办?我可以回到旧版本的 iptables 吗?
请记住,我是 IT 界的一名真正的初学者。

答案1

解决方案是这里:内核升级后需要重启。最简单的方法当然是:

# as root
reboot

答案2

Raspbian 肯定遵循了 Debian 的上游:默认情况下,较新的iptables用户空间工具使用nftables内核 API,而不是“传统” iptables 内核 API,如所述这里

当前状态

注意:Debian Buster 默认使用 nftables 框架。

从 Debian Buster 开始,nf_tables 是使用 iptables 时的默认后端,通过 iptables-nft 层(即使用 nf_tables 内核子系统的 iptables 语法)。这也会影响 ip6tables、arptables 和 ebtables。

nftables旨在iptables用扩展功能完全替代,但实现方式却大不相同。无论如何都会保留一个兼容层,主要在用户空间工具中,但部分在内核中。这是对通常的iptables“遗留”层的补充,该层仍将在内核中保留很长时间。

的较新版本iptables正在使用此兼容层。可以通过运行(以 root 身份)轻松验证这一点iptables -V。结果肯定是:

# iptables -V
iptables v1.8.2 (nf_tables)

虽然旧版本仍在发布:

# iptables-legacy -V
iptables v1.8.2 (legacy)

同时,我猜测您的内核由于某种原因不支持 nftables。

所以你可以:

  • 在内核中获得对 nftables 的支持(可能至少NFT_COMPAT)。如果您保留了较旧的版本,则可能需要重新编译或升级它。如果此任务需要太多精力,您可以使用另一种选择,

  • 或者使用旧版本,iptables该版本将使用通常的 iptables 内核 API。上一个链接解释如何操作。以 root 用户身份执行(至少对于iptablesip6tables,如果安装了 和 ,可能对于ebtablesarptables):

    切换到旧版本:

    # update-alternatives --set iptables /usr/sbin/iptables-legacy
    # update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
    # update-alternatives --set arptables /usr/sbin/arptables-legacy
    # update-alternatives --set ebtables /usr/sbin/ebtables-legacy
    

答案3

我的错误如下:

docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

如果你仔细观察,sudo cat /var/log/docker.log你会发现

Running iptables --wait -t nat -L -n failed with message: `iptables/1.8.7 Failed to initialize nft: Protocol not supported`, error: exit status 1

在 WSL2 上安装 docker

我遇到了同样的错误。我找到的修复方法来自这里:

https://dev.to/felipecrs/simply-run-docker-on-wsl2-3o8

sudo update-alternatives --set iptables /usr/sbin/iptables-legacy

希望有所帮助。

答案4

我尝试使用他们的便利脚本当 Docker 引擎尝试配置时,iptables我遇到了同样的错误。这只发生在我的旧 Raspberry Pi B+ Rev 1.2 上,而不是 Raspi 3 B Rev 1.2 上。前者运行5.4.51-v7+,后者运行5.4.51+,两者在内核方面都应该是完全最新的。

为了修复该安装问题,我运行了update-alternatives来自@AB 响应的命令,并修复sudo iptables -V了显示iptables/1.8.2 Failed to initialize nft: Protocol not supported问题iptables v1.8.2 (legacy)

但是,在此之后尝试运行 Docker 的 iptables 命令时:

$ sudo iptables --wait -t nat -L -n
iptables v1.8.2 (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.

现在,修复的方法是为了启用iptable@AB 所说的“遗留”层就像这样(@conrad 的回答):

sudo su -
modprobe ip_tables
echo 'ip_tables' >> /etc/modules
exit

重新启动以重新加载内核模块后,我检查了 docker systemd 服务是否已开始使用sudo systemctl status docker并且是否正常运行。

相关内容