解决 WSL 2 中 Ubuntu 22.04 安装 Docker 后无法启动的问题

问题场景

安装Docker后,执行sudo service docker start启动Docker,提示启动成功

bash 复制代码
root@Dev:~# sudo service docker start
* Starting Docker: docker                                                                                   [ OK ]

执行sudo service docker status查看Docker状态,发现Docker已停止运行

bash 复制代码
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就能够正常启动并管理网络规则。

python 复制代码
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 的实现是否正确:

bash 复制代码
root@Dev:~# iptables --version
iptables v1.8.7 (legacy)

验证

启动Docker并查看状态可以发现,通过WSL 2运行的Ubuntu安装Docker是正常运行的,问题已得到解决

bash 复制代码
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
相关推荐
bugtraq202118 分钟前
XiaoMi Mi5(gemini) 刷入Ubuntu Touch 16.04——安卓手机刷入Linux
linux·运维·ubuntu
CodeWithMe1 小时前
[ Vim ] 常用命令 and 配置
linux·编辑器·vim
DC_BLOG1 小时前
Linux-GlusterFS进阶分布式卷
linux·运维·服务器·分布式
cookies_s_s2 小时前
Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)
linux·运维·服务器·数据结构·c++·算法·哈希算法
丁劲犇2 小时前
碳基生物的悲歌-DeepSeek思考实现Linux动态库递归收集工具
linux·递归·deepseek·ldd
zhouwu_linux2 小时前
MT7628基于原厂的SDK包, 修改ra1网卡的MAC方法。
linux·运维·macos
大地爱2 小时前
在Ubuntu 22.04 LTS 上安装 MySQL两种方式:在线方式和离线方式
mysql·ubuntu·adb
2401_897930063 小时前
linux系统如何配置host.docker.internal
linux·docker·eureka
诶尔法Alpha3 小时前
Linux上使用dify构建RAG
linux·运维·服务器
丰色木夕3 小时前
Ubuntu+vscode+CGAL6.0库安装入门教程
ubuntu·cgal