背景
docker run -d --name nginx-port -p 80:80
报错信息
docker: Error response from daemon: driver failed programming external
connectivity on endpoint nginx-port
(3a88d949a07738982c69792a683eef7a732cabfd6716336a835a7f57c1b712e4):
(COMMAND_FAILED: ‘/usr/sbin/iptables -w10 -t nat -A DOCKER -p tcp -d
0/0 --dport 80 -j DNAT --to-destination 172.17.0.3:80 ! -i docker0’
failed: iptables: No chain/target/match by that name
这个错误信息说明在执行 iptables 规则配置时遇到了问题,导致 Docker 无法将容器端口正确映射到主机端口。具体错误是 iptables 中缺少某些链或规则,通常发生在 Docker 安装或防火墙配置出现问题的情况下。可以尝试以下方法来解决这个问题:
1、检查 Docker 服务和 iptables 模块
首先确保 Docker 服务和 iptables 相关模块正确加载:
sudo systemctl restart docker
如果 iptables 或相关模块没有正确加载,重启 Docker 可能会帮助重新配置相关规则。
2、检查并更新 iptables
iptables 的一些规则可能未被正确配置。可以通过以下命令检查并更新
sudo iptables -L -t nat
确保 DOCKER 链存在并正确配置。如果不存在 DOCKER 链,可能是 iptables 被外部工具(例如 firewalld)干扰。
3、使用 firewalld 进行配置
如果使用的是 firewalld,可以尝试重新加载 firewalld 规则:
sudo firewall-cmd --zone=public --add-masquerade --permanent
sudo firewall-cmd --reload
–add-masquerade 用于启用 firewalld 的 NAT 转发功能,这有助于解决 Docker 端口转发的问题。
4、禁用和启用 Docker 的 iptables 选项
在某些情况下,可以尝试禁用 Docker 的 iptables 管理选项,然后再重新启用:
编辑 Docker 的配置文件 /etc/docker/daemon.json,添加或修改以下内容:
{
"iptables": false
}
重新启动 Docker:
sudo systemctl restart docker
再次修改配置文件,将 iptables 设置回 true,然后重启 Docker:
{
"iptables": true
}
再次重启 Docker 服务:
sudo systemctl restart docker
5、重新加载 iptables 和 Docker 网络规则
重新加载 iptables,并让 Docker 重新生成网络规则:
sudo iptables -F
sudo iptables -t nat -F
sudo systemctl restart docker
这将清除现有的 iptables 规则,并让 Docker 重建它的 NAT 规则。
6、重启主机
如果上述步骤仍然未能解决问题,尝试重启主机来确保所有配置和网络模块正确加载。


被折叠的 条评论
为什么被折叠?



