问题场景
安装Docker后,执行sudo service docker start
启动Docker,提示启动成功
root@Dev:~# sudo service docker start
* Starting Docker: docker [ OK ]
执行sudo service docker status
查看Docker状态,发现Docker已停止运行
root@Dev:~# sudo service docker status
* Docker is not running
问题的根本原因
iptables和nftables
iptables是Linux内核中用于管理网络规则的工具。
nftables是iptables 的下一代替代品,提供了更强大的功能和性能。
在某些Linux发行版(如 Ubuntu 20.04 及更高版本)中,iptables被替换为iptables-nft,即基于nftables的兼容层。
Docker的依赖
Docker依赖于传统的 iptables-legacy 来管理网络规则。
如果系统默认使用的是 iptables-nft,Docker 可能无法正确配置网络规则,导致启动失败。
结论
Docker的网络功能(如端口映射、网络隔离)依赖于传统的iptables
规则。虽然iptables-nft提供了兼容层,但在某些情况下,Docker可能无法正确解析或应用这些规则,导致网络初始化失败。
解决
运行
sudo update-alternatives --config iptables
切换iptables实现,系统会提示选择iptables
的实现方式。
通常有以下选项:
iptables-legacy:传统的iptables实现
iptables-nft:基于nftables的兼容层
通过选择iptables-legacy
,将系统切换回Docker兼容的传统iptables
实现,于是Docker就能够正常启动并管理网络规则。
root@Dev:~# sudo update-alternatives --config iptables
There are 2 choices for the alternative iptables (providing /usr/sbin/iptables).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/sbin/iptables-nft 20 auto mode
1 /usr/sbin/iptables-legacy 10 manual mode
2 /usr/sbin/iptables-nft 20 manual mode
Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/sbin/iptables-legacy to provide /usr/sbin/iptables (iptables) in manual mode
切换后,可以验证 iptables 的实现是否正确:
root@Dev:~# iptables --version
iptables v1.8.7 (legacy)
验证
启动Docker并查看状态可以发现,通过WSL 2运行的Ubuntu安装Docker是正常运行的,问题已得到解决
root@Dev:~# sudo service docker restart
* Starting Docker: docker [ OK ]
root@Dev:~# sudo service docker status
* Docker is running
root@Dev:~# sudo service docker status
* Docker is running