容器端口映射错误的解决方式

背景

 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、重启主机

如果上述步骤仍然未能解决问题,尝试重启主机来确保所有配置和网络模块正确加载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值