Ubuntu 系统 Docker 启动失败(iptables/nf\_tables)
Ubuntu 系统 Docker 启动失败(iptables/nf_tables)问题排查与修复详解
在 Ubuntu 系统中安装 Docker 后,有部分用户在启动 Docker 服务时遇到如下报错:
Failed to start Docker Application Container Engine.
failed to create NAT chain DOCKER: iptables v1.8.7 (nf_tables): Could not fetch rule set generation id: Invalid argument
本文将详细解释该问题的原因,并提供完整的修复方案。
问题现象
使用以下命令启动 Docker:
sudo systemctl start docker
执行后,使用以下命令查看docker运行情况
sudo systemctl status docker
发现状态为 failed
,
使用以下命令查看详细错误日志
sudo journalctl -u docker.service --no-pager --since "10 minutes ago"
伴随日志提示:
failed to create NAT chain DOCKER: iptables v1.8.7 (nf_tables): Could not fetch rule set generation id: Invalid argument
这是 Docker 在使用默认 iptables-nft
后端时,与内核的 nf_tables
实现存在兼容性问题,无法创建 NAT 表中用于容器网络的 DOCKER
chain。
原因分析
Ubuntu 从 20.04 起,iptables 默认使用 nf_tables
模式,而 Docker 更稳定地支持 iptables-legacy
模式。
这就导致 Docker 启动时无法正确配置网络桥接规则,从而守护进程失败退出。
解决方案:切换为 iptables-legacy 模式
1. 确保系统已安装 iptables(非 nft 工具包)
sudo apt install iptables
2. 执行切换命令(无需单独安装 iptables-legacy 包)
sudo update-alternatives --config iptables
系统会提示你可选项,例如:
选择带有 iptables-legacy
的序号(如 1
),然后回车。
同理,切换 IPv6:
sudo update-alternatives --config ip6tables
3. 若缺少 iptables-legacy
可用项,可软链接模拟:
sudo ln -sf /usr/sbin/iptables /usr/sbin/iptables-legacy
sudo ln -sf /usr/sbin/ip6tables /usr/sbin/ip6tables-legacysudo update-alternatives --install /usr/sbin/iptables iptables /usr/sbin/iptables-legacy 100
sudo update-alternatives --install /usr/sbin/ip6tables ip6tables /usr/sbin/ip6tables-legacy 100
然后再次运行 --config
命令进行选择。
4. 重启 Docker 服务
sudo systemctl daemon-reexec
sudo systemctl restart docker
5. 验证是否恢复正常
docker info
docker run hello-world
如无报错即修复成功。